117. 填充每个节点的下一个右侧节点指针 II

142 阅读1分钟

题目介绍

力扣117题:leetcode-cn.com/problems/po…

image.png

image.png

分析

其实这道题目跟[116. 填充每个节点的下一个右侧节点指针]还是有一些区别得。

  • 该题目只是针对二叉树。
  • 填充next指针不一定填充的是属于同一个父节点得元素

我们可以通过层序遍历的方式,遍历每一层元素,然后再依次填充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 {
    public Node connect(Node root) {
        if(root == null) {
            return null;
        }
        Queue<Node> queue = new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int n = queue.size();
            Node lastNode = null;
            for (int i = 0; i < n; i++) { 
                // 变量 i 无实际意义,只是为了循环 n 次
                Node node = queue.poll();
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
                if(lastNode != null) {
                    lastNode.next = node;
                }   
                lastNode = node;
            }
        }
        return root;
    }
}