目录
116. 填充每个节点的下一个右侧节点指针
题解:
代码:
运行结果:
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node { int val; Node *left; Node *right; Node *next; }填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为
NULL
。初始状态下,所有 next 指针都被设置为
NULL
。示例 1:
输入:root = [1,2,3,4,5,6,7] 输出:[1,#,2,3,#,4,5,6,7,#] 解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。示例 2:
输入:root = [] 输出:[]提示:
- 树中节点的数量在
[0, 212 - 1]
范围内-1000 <= node.val <= 1000
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
迭代解法题解:
// 迭代解决:仔细观察发现有两种连接方式
// 1、两个连接点有共同父节点
// 2、两个连接点父节点不同,分别是一个节点和上一层邻居next的左节点
// 我们可以根据当前节点处理他的子节点,相当于一层一层处理
// 所以需要两个循环嵌套,里面的横向处理完该层,再竖向进入下一层
代码:
/* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, Node _left, Node _right, Node _next) { val = _val; left = _left; right = _right; next = _next; } }; */ class Solution { // 迭代解决:仔细观察发现有两种连接方式 // 1、两个连接点有共同父节点 // 2、两个连接点父节点不同,分别是一个节点和上一层邻居next的左节点 // 我们可以根据当前节点处理他的子节点,相当于一层一层处理 // 所以需要两个循环嵌套,里面的横向处理完该层,再竖向进入下一层 public Node connect(Node root) { // 特判:无节点则不需处理 if(root==null) return root; // 定义一个节点等于root Node pre=root; // 左节点不为空则这层需要处理,进入循环开始处理这一层 while(pre.left!=null){ Node tmp=pre; while(tmp!=null){ // 处理有共同父节点的连接点 tmp.left.next=tmp.right; // 处理父节点不同的连接点 if(tmp.next!=null){ tmp.right.next=tmp.next.left; } // 横向移动处理这一层未处理的节点 tmp=tmp.next; } // 竖向移动处理下一层 pre=pre.left; } return root; } }
运行结果: