声明:问题描述来源于leetcode
一、问题描述:
117. 填充每个节点的下一个右侧节点指针 II
难度中等646
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
进阶:
- 你只能使用常量级额外空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
示例:
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。
二、题解:
首先这个也是基于层序遍历的搜索方法进行改造。
用了两层递归,searchGoal方法是对左右孩子节点进行处理,addToNext方法是对next节点的寻找。肯定是先帮右树孩子先找到next节点再帮左孩子找的,得有先后顺序!因为寻找next节点是往父节点的next寻找的。
而如果是先对左树孩子进行处理的话,那么在寻找next节点的过程可能遇到右树孩子的next节点还没有构建完成导致失败。
class Solution {
public Node connect(Node root) {
if (root == null) return root;
searchGoal(root);
return root;
}
private void searchGoal(Node root) {
if (root.right != null){
addToNext(root.right,root.next);
searchGoal(root.right);
}
if (root.left != null){
root.left.next = root.right;
if (root.left.next == null) addToNext(root.left,root.next);
searchGoal(root.left);
}
}
private void addToNext(Node node, Node next) {
if (next == null) return;
node.next = next.left != null?next.left:next.right;
if (node.next == null){
addToNext(node,next.next);
}
}
}