116. 填充每个节点的下一个右侧节点指针
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

进阶:

你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

图片说明

运行结果
图片说明
解题思路
完美二叉树每一层都是左右侧的next指针为空
解决难点是如何实现跨父节点的子节点相连
利用递归的思想,利用两个节点进行遍历,将两个节点的孩子节点相连,可以解决上述问题
java代码

/*
// 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 {
    public Node connect(Node root) {
        if(root == null) return root;
        //利用左右两个节点实现连接
        connecthelp(root.left,root.right);
        //最后返回根节点
        return root;
    }
    public void connecthelp(Node a,Node b){
        if(a == null || b == null) return;//完美二叉树有节点为空,则该行为空,直接返回
        a.next=b;//该层两个节点相连
        connecthelp(a.left,a.right);//a节点的左右子树
        connecthelp(a.right,b.left);//a和b之间跨父节点相连
        connecthelp(b.left,b.right);//b节点的左右子树
    }
}