二叉树算法题(一)

根据二叉树创建字符串 

根据二叉树创建字符串

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

 

此题使用C++和递归做,其实只有一个难点,就是判断括号何时省略的问题:括号的省略要以不影响树的构建为准。

class Solution {void PreOrder(TreeNode* root, string & tarstr){tarstr += to_string(root->val);if(root->left){//左子树不为空,必须加上括号tarstr += "(";PreOrder(root->left,tarstr);tarstr += ")";}else if(root->left == nullptr && root->right){// 左子树为空,但右子树不为空// 不能省略括号tarstr+="()";}if(root->right){// 右子树不为空,当然也不能省略括号tarstr += "(";PreOrder(root->right,tarstr);tarstr += ")";}}
public:string tree2str(TreeNode* root) {// PreOrder 遍历  中、左、右string tarstr = "";PreOrder(root,tarstr);return tarstr;}
};

二叉树的层序遍历 

二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

 思路: 使用队列来控制层序遍历,采用一个变量 LeverSize 来记录每一层的结点数,根据这个 LeverSize 每一层最为入队和出队数量的依据。

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> vv;if(root==nullptr) return vv;int leverSize = 0;queue<TreeNode*> que;que.push(root);leverSize = 1;while(!que.empty()){vector<int> v1;while(leverSize--){TreeNode*cur = que.front();if(cur == nullptr) break;if(cur->left) que.push(cur->left);if(cur->right) que.push(cur->right);int top = cur->val;v1.push_back(top);que.pop();}leverSize = que.size();vv.push_back(v1);}return vv;}
};

二叉树的最近公共祖先 

 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

思路:将两个结点前序遍历的路径(结点)分别存放在两个栈中,先使两个栈的大小相等,然后各自出栈,确定这两个栈中的第一个相等的栈顶元素,就是他们两个结点最近的公共祖先。

class Solution {
public:bool PreOrder(TreeNode* root, stack<TreeNode*>& st, TreeNode* tar){if(root == nullptr) return false;st.push(root);if(root == tar) return true;if(PreOrder(root->left,st,tar)==true) return true;if(PreOrder(root->right,st,tar)==true) return true;//走到此处,说明左右子树都为空或者找不到st.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> st1, st2;TreeNode* cur = root;PreOrder(root, st1, p);PreOrder(root, st2, q);while(st1.size()!=st2.size()){if(st1.size()>st2.size()) st1.pop();else st2.pop();}while(st1.top()->val != st2.top()->val) {st1.pop();st2.pop();}return st1.top();}
};

二叉搜索树与双向链表

二叉搜索树与双向链表 

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

 注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继

2.返回链表中的第一个节点的指针

3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出双向链表,程序会根据你的返回值自动打印输出

输入描述:二叉树的根节点

返回值描述:双向链表的其中一个头节点。

 

思路:依据中序遍历的思路,定义一个前驱结点 prev,作为每次中序遍历访问结点的前一个结点,将 prev 的 right 指向当前结点,当前结点的 left 指向 prev。由于中序遍历搜索二叉树,肯定是升序的顺序,那么前驱 prev 与 中序遍历访问的结点结合,便能很好的链接在一起。

class Solution {
public:void PreOrder(TreeNode* root, TreeNode*& prev){if(root == nullptr) return;PreOrder(root->left, prev);root->left = prev;if(prev) prev->right = root;prev = root;PreOrder(root->right, prev);}TreeNode* Convert(TreeNode* pRootOfTree) {TreeNode* prev = nullptr;PreOrder(pRootOfTree,prev);TreeNode* head= pRootOfTree;while(head && head->left){head = head->left;}return head;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329425.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker基础一】Docker安装Elasticsearch,Kibana,IK分词器

安装elasticsearch 下载镜像 查看版本&#xff1a;Elasticsearch Guide [8.11] | Elastic # 下载镜像 docker pull elasticsearch:7.17.16 # 查看镜像是否下载成功 docker images创建网络 因为需要部署kibana容器&#xff0c;要让es和kibana容器互联 # 创建一个网络&…

超维空间M1无人机使用说明书——01、ROS机载电脑使用说明——远程连接

引言&#xff1a;远程连接通常采用两种方式&#xff0c;一种是通过可视化软件&#xff0c;如VNC、Nomachine等&#xff0c;另外一种是使用SSH。各有优缺点&#xff0c;两种远程登录方式的优缺点做一个简单的对比&#xff1a; 1、SSH优缺点 优点:1、消耗网络资源 2、运行稳定 …

vue结合Cesium加载gltf模型

Cesium支持什么格式&#xff1f; Cesium支持的格式包括&#xff1a;3D模型格式&#xff08;如COLLADA、gITF、OBJ&#xff09;、影像格式&#xff08;如JPEG、PNG、GeoTIFF&#xff09;、地形格式&#xff08;如STL、Heightmap&#xff09;、矢量数据格式&#xff08;如GeoJSON…

如何实现公网访问GeoServe Web管理界面共享空间地理信息【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

遗传算法(GA)、模拟退火算法(SAA)、蚁群算法(ACO)、粒子群算法(PSO)优缺点汇总

遗传算法 优点&#xff1a; 与问题领域无关且快速随机的搜索能力&#xff0c;不会陷入局部最优解&#xff1b;搜索从群体出发&#xff0c;具有潜在的并行性&#xff0c;提高运行速度&#xff0c;鲁棒性高&#xff1b;搜索使用评价函数启发&#xff0c;过程简单&#xff1b;使…

服务容错-熔断策略之断路器hystrix-go

文章目录 概要一、服务熔断二、断路器模式三、hystrix-go3.1、使用3.2、源码 四、参考 概要 微服务先行者Martin Fowler与James Lewis在文章microservices中指出了微服务的九大特征&#xff0c;其中一个便是容错性设计(Design for failure)。正如文章中提到的&#xff0c;微服…

【LMM 013】ImageBind: One Embedding Space To Bind Them All

论文标题&#xff1a;ImageBind: One Embedding Space To Bind Them All 论文作者&#xff1a;Rohit Girdhar, Alaaeldin El-Nouby, Zhuang Liu, Mannat Singh Kalyan, Vasudev Alwala, Armand Joulin, Ishan Misra∗ 作者单位&#xff1a;FAIR, Meta AI 论文原文&#xff1a;h…

SpringSecurity集成JWT实现后端认证授权保姆级教程-数据准备篇

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f492; 公众号&#xff1a;知识浅谈 &#x1f525;网站…

初识Linux shell

Linux初探 Linux系统可以划分为4个部分&#xff1a; Linux内核&#xff1a;Linux系统的核心&#xff0c;控制着系统的所有硬件和软件&#xff0c;在必要时分配硬件&#xff0c;并根据需要执行软件。 内核主要功能&#xff1a; 系统内存管理&#xff1a;内核通过硬件上称为交换…

C++ goto语句

作用&#xff1a;可以无条件跳转语句&#xff0c;类似计算机组成原理mips指令集中的jump直接跳转指令&#xff08;汇编语言&#xff09;。 语法&#xff1a;goto标记&#xff1b; 解释&#xff1a;如果标记的名称存在&#xff0c;执行到goto语句时&#xff0c;会跳转到标记的…

2024年更新阿里云服务器地域选择方法,哪个地域比较好?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

为什么圈子里面的很讨厌阿里巴巴出来的CTO

在杭州的互联网公司&#xff0c;有一个不争的事实&#xff0c;那就是独角兽公司的CTO几乎都是阿里背景的&#xff0c;且都是高P的&#xff0c;当然很少有高M的&#xff0c;高M的基本上都是自己开公司做CEO或者是做业务总裁了。 为什么会这个样子呢&#xff1f;当然还是由于阿里…