2.<tag-二叉树和层序遍历相关题>-lt.116. 填充每个节点的下一个右侧节点指针 + lt.117. 填充每个节点的下一个右侧节点指针 II
lt.116. 填充每个节点的下一个右侧节点指针
[案例需求]

[思路分析一, 迭代法]

[代码实现]
/*
// 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) {
        //层序遍历, queue存储, 
        Queue<Node> queue = new ArrayDeque<>();
        if(root == null)return root;
        queue.add(root);
        Node res = root;
        // 目的是每一层连接起来
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i = 0; i < size; i++){
                root = queue.poll();
                
                //把每一层的结点连接起来, 每一层最后一个结点除外
                if(i < size - 1)root.next = queue.peek();
                if(root.left != null)queue.add(root.left);
                if(root.right != null)queue.add(root.right);
            }
        }
        return res;
    }
}


[思路分析二, 递归实现]
/*
// 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. 递归函数: 连接同一层的结点, 参数: 以当前节点为根节点的结点;
    // 返回值:  返回的是被看做根节点的当前节点
    public Node connect(Node root) {
        //2. 递归结束条件
        if(root == null)return root;
        //3. 单层递归逻辑
        if(root.left != null){
            //3.1 连接一棵子树内的左右结点
            root.left.next = root.right;
            //3.2 连接不同子树之间的右结点和左结点
            //上层的next结点已经是已知的, 所以我们利用root.next获取到root右边的那棵子树
            if(root.next != null)root.right.next = root.next.left;
        }
        
		//4. 递归调用
        connect(root.left);
        connect(root.right);
        return root;
    }
}
lt.117. 填充每个节点的下一个右侧节点指针 II
[案例需求]

[思路分析一, 借助队列的层序遍历]
- 毋庸多说, 这个解法跟上一题的思路完全一致
[代码实现]
/*
// 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;
        Queue<Node> queue = new ArrayDeque<>();
        queue.add(root);
        Node res = root;
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i = 0; i < size; i++){
                root = queue.poll();
                
                if(i < size - 1){
                    root.next = queue.peek();
                }
                 if(root.left != null)queue.add(root.left);
                 if(root.right != null)queue.add(root.right);
            }
        }
        return res;
    }
}

[思路分析二, ]
- 待补充题解: 点我
[代码实现]
/*
// 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;
        //cur我们可以把它看做是每一层的链表
        Node cur = root;
        Node dummy = new Node(0);
        while (cur != null) {
            dummy.next = null;
            //遍历当前层的时候,为了方便操作在下一
            //层前面添加一个哑结点(注意这里是访问
            //当前层的节点,然后把下一层的节点串起来)
            //pre表示访下一层节点的前一个节点
            Node pre = dummy;
            //然后开始遍历当前层的链表
            while (cur != null) {
                if (cur.left != null) {
                    //如果当前节点的左子节点不为空,就让pre节点
                    //的next指向他,也就是把它串起来
                    pre.next = cur.left;
                    //然后再更新pre
                    pre = pre.next;
                }
                //同理参照左子树
                if (cur.right != null) {
                    pre.next = cur.right;
                    pre = pre.next;
                }
                //继续访问这样行的下一个节点
                cur = cur.next;
            }
            //把下一层串联成一个链表之后,让他赋值给cur,
            //后续继续循环,直到cur为空为止
            cur = dummy.next;
        }
        return root;
    }
}

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号