每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点
Populating Next Right Pointers in Each Node
原题链接Populating Next Right Pointers in Each Node
将完全二叉树每个节点的next指针赋值,每个节点的next指针指向同一层的下一个节点,要求空间复杂度是O(1)
其实如果没有空间复杂度的要求,可以使用层次遍历,一种是使用队列,为了控制层次可以在每层的节点后面向队列追加一个空指针,另一种是递归,通过变量控制层数
既然有空间复杂度的限制,就不能使用额外的空间了。又因为肯定是需要从根节点开始设置next指针,所以如果某一时刻到达一个节点node,它所在的层数是h,那么可以确定的一点是,h-1层的next指针已经设置完毕。
这在某种程度上带来了便利,因为可以根据h-1层的节点获得第h层的所有节点,从而按照顺序一个个设置next指针即可
到此可以确定,在遍历的过程中(二叉树肯定是递归),需要同时记录第h层的第一个节点和第h-1层的第一个节点。这样,通过第h-1层的节点的next指针可以遍历到h-1层的所有节点,又根据这些节点可以遍历到第h层的所有节点
代码如下
/*** Definition for binary tree with next pointer.* struct TreeLinkNode {* int val;* TreeLinkNode *left, *right, *next;* TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}* };*/
class Solution {
public:void connect(TreeLinkNode *root) {if(!root) return;linkNode(root, root->left);}
private:/* * prev : 第h-1层的第一个节点* cur : 第h层的第一个节点*/void linkNode(TreeLinkNode* prev, TreeLinkNode* cur){if(!cur) return;/* 记录第h层的第一个节点,用于下次递归 */TreeLinkNode* root = cur;while(prev){/* 依次设置next指针 */cur->next = prev->right;cur = cur->next;/* 移动prev */prev = prev->next;if(!prev) break;/* 继续设置next指针 */cur->next = prev->left;cur = cur->next;}linkNode(root, root->left);}
};
当然本题的前提是给定的二叉树是完全二叉树,即所有的叶子节点都在同一层
Populating Next Right Pointers in Each Node II
原题链接Populating Next Right Pointers in Each Node II
本题要求和上面一样,不同的是这里给定的二叉树不一定是完全二叉树
需要改动的地方只有递归时的while循环,在循环中,每次都需要找到第h-1层的下一个节点,然后找到第h层的下一个节点,因为下一个节点不一定是prev的子节点。不过也方便,判断prev的左右子节点是否存在即可
代码如下
/*** Definition for binary tree with next pointer.* struct TreeLinkNode {* int val;* TreeLinkNode *left, *right, *next;* TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}* };*/
class Solution {
public:void connect(TreeLinkNode *root) {if(!root) return;/* 因为可能不是完全二叉树,所以下一层的第一个节点需要手动寻找 */if(root->left)linkNode(root, root->left);elselinkNode(root, root->right);}
private:/* prev : 第h-1层第一个节点* cur : 第h层第一个节点 */void linkNode(TreeLinkNode* prev, TreeLinkNode* cur){if(!cur) return;TreeLinkNode* root = cur;while(prev && cur){/* 寻找第h层的下一个节点 */TreeLinkNode* curNext = nullptr;while(prev && !curNext){/* 因为cur最差也是prev的左节点,所以先从右节点判断 */if(prev->right && prev->right != cur){curNext = prev->right;}else{/* 不是右节点,prev后移,然后判断左节点 */prev = prev->next;/* 如果左节点存在,则就是h层的下一个节点,如果不存在,继续判断右节点 */curNext = prev ? prev->left : curNext;}}/* 设置nex指针 */cur->next = curNext;cur = curNext;}/* 寻找第h+1层的第一个节点 */while(root && !root->left && !root->right)root = root->next;if(!root) return;if(root->left)linkNode(root, root->left);elselinkNode(root, root->right);}
};
本题的难点是当二叉树不是平衡二叉树时,如果寻找下一个节点,需要根据prev的next指针遍历,找到第一个存在且和cur不相等的节点作为cur的下一个节点
每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点相关推荐
- 二叉树中序遍历的下一个节点
题目描述: 给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 解题思路: 这道题意即:给定一个节点,按照中序 ...
- 《剑指offer》二叉树的下一个节点
题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解析:主要分两大类.一类:该节点有右子树,则找到右子树的最 ...
- 剑指offer——8.二叉树的下一个节点
题目: 题:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 知识点: 树的基本知识,节点的2个属性(value. ...
- 剑指Offer之寻找二叉树下一个节点
寻找二叉树下一个节点 1.题目描述 2.题目理解 1.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. ...
- 【二叉树】剑指offer:二叉树中序遍历的下一个节点
思路一:vector存放中序遍历,然后查找输出 注意: pNode是待查找节点,因为要通过父节点遍历二叉树,所以首先要找到父节点 TreeNode *temp=t; TreeNode *root; w ...
- 8.二叉树的下一个节点(待填坑)
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路1:窒息了,对树进行了一波分析,思路是对的,但是代 ...
- activiti根据当前节点获取下一个节点信息
在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以 ...
- DOM算法系列002-寻找指定DOM节点的上一个或下一个节点
DOM操作算法002-寻找指定DOM节点的上一个或下一个节点-- getDomNode 当我们需要寻找指定DOM节点的上一个节点或下一个节点时,我们可能第一时间会想到下面两个API: node.pre ...
- activiti简单的方式设置流程下一个节点的处理人
activiti简单的方式设置流程下一个节点的处理人 activiti 6.0 使用场景:流程创建时每个节点已经设置了多个审批人,需求场景需要每次审批都可以手动再设置下一步的审批人. 例:节点1的审批 ...
最新文章
- 英伟达开源行人生成/重识别代码
- TCP三次握手、四次挥手过程及原理
- 算法导论 c语言,算法导论 之 堆排序[C语言]
- 解决Linux报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
- JS splice()方法
- 解析H.264视频编解码DSP实现与优化
- 材料科学与工程考计算机,计算机在材料科学与工程中应用作业.pdf
- python两大特性与四大语法_Day 1:Python 两大特性和四大基本语法
- Https的数据请求的证书设置
- html5应用开发大赛
- mysql文件写入和读出数据库
- Python requests抓取有道翻译 最新版破解js加密
- 学画画怎么画三点透视图
- Windows下安装神通数据库
- 申请 GoDaddy SSL 证书
- “向日葵”远程控制软件,方舟Q2硬件付费/免费功能全面评测,拔草向
- 1.关于433MHz按键单片机解码
- java.io.IOException: Unable to read entire header; 275 bytes read; expected 512 bytes
- vxlan报文 wireshark_VXLAN原理_ISIS、BGP、MPLS v隧道、QOS 技术精讲(肖哥)_华为认证视频-51CTO学院...
- PIC16F15323单片机 (中断与定时器Timer0)
热门文章
- Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
- join orcl的left_oracle中left join与where
- tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
- 成功者五大因素 奸的好人-笔记
- C之printf()函数
- css固定gridview的表头
- android自定义viewgroup之我也玩瀑布流
- .NET错误:未找到类型或命名空间名称
- 【数据结构与算法】之深入解析“二叉树的前序遍历”的求解思路与算法示例
- Python之值得学习练手的22个迷你程序(附代码)