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节点,指向同一层的下一个节点相关推荐

  1. 二叉树中序遍历的下一个节点

    题目描述: 给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左.右子节点的指针,还有一个指向父节点的指针. 解题思路: 这道题意即:给定一个节点,按照中序 ...

  2. 《剑指offer》二叉树的下一个节点

    题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解析:主要分两大类.一类:该节点有右子树,则找到右子树的最 ...

  3. 剑指offer——8.二叉树的下一个节点

    题目: 题:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 知识点: 树的基本知识,节点的2个属性(value. ...

  4. 剑指Offer之寻找二叉树下一个节点

    寻找二叉树下一个节点 1.题目描述 2.题目理解 1.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. ...

  5. 【二叉树】剑指offer:二叉树中序遍历的下一个节点

    思路一:vector存放中序遍历,然后查找输出 注意: pNode是待查找节点,因为要通过父节点遍历二叉树,所以首先要找到父节点 TreeNode *temp=t; TreeNode *root; w ...

  6. 8.二叉树的下一个节点(待填坑)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路1:窒息了,对树进行了一波分析,思路是对的,但是代 ...

  7. activiti根据当前节点获取下一个节点信息

    在流程中使用监听器判断当前节点是否需要经过,否则跳转到下一个节点,如下图 当提交申请之后,当前提交人为部门负责人,那么部门负责人节点就不需要走了,直接到下一个节点,但是下一个节点是什么并不知道,就可以 ...

  8. DOM算法系列002-寻找指定DOM节点的上一个或下一个节点

    DOM操作算法002-寻找指定DOM节点的上一个或下一个节点-- getDomNode 当我们需要寻找指定DOM节点的上一个节点或下一个节点时,我们可能第一时间会想到下面两个API: node.pre ...

  9. activiti简单的方式设置流程下一个节点的处理人

    activiti简单的方式设置流程下一个节点的处理人 activiti 6.0 使用场景:流程创建时每个节点已经设置了多个审批人,需求场景需要每次审批都可以手动再设置下一步的审批人. 例:节点1的审批 ...

最新文章

  1. 英伟达开源行人生成/重识别代码
  2. TCP三次握手、四次挥手过程及原理
  3. 算法导论 c语言,算法导论 之 堆排序[C语言]
  4. 解决Linux报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
  5. JS splice()方法
  6. 解析H.264视频编解码DSP实现与优化
  7. 材料科学与工程考计算机,计算机在材料科学与工程中应用作业.pdf
  8. python两大特性与四大语法_Day 1:Python 两大特性和四大基本语法
  9. Https的数据请求的证书设置
  10. html5应用开发大赛
  11. mysql文件写入和读出数据库
  12. Python requests抓取有道翻译 最新版破解js加密
  13. 学画画怎么画三点透视图
  14. Windows下安装神通数据库
  15. 申请 GoDaddy SSL 证书
  16. “向日葵”远程控制软件,方舟Q2硬件付费/免费功能全面评测,拔草向
  17. 1.关于433MHz按键单片机解码
  18. java.io.IOException: Unable to read entire header; 275 bytes read; expected 512 bytes
  19. vxlan报文 wireshark_VXLAN原理_ISIS、BGP、MPLS v隧道、QOS 技术精讲(肖哥)_华为认证视频-51CTO学院...
  20. PIC16F15323单片机 (中断与定时器Timer0)

热门文章

  1. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  2. join orcl的left_oracle中left join与where
  3. tomcat启动停止在 Initializing Spring root WebApplicationContext,就不运行了
  4. 成功者五大因素 奸的好人-笔记
  5. C之printf()函数
  6. css固定gridview的表头
  7. android自定义viewgroup之我也玩瀑布流
  8. .NET错误:未找到类型或命名空间名称
  9. 【数据结构与算法】之深入解析“二叉树的前序遍历”的求解思路与算法示例
  10. Python之值得学习练手的22个迷你程序(附代码)