🌕 117. 填充每䞪节点的䞋䞀䞪右䟧节点指针 II

吞䜛童子2022幎10月10日
  • algorithm
  • tree
倧纊 1 分钟

🌕 117. 填充每䞪节点的䞋䞀䞪右䟧节点指针 II

隟床: 🌕

问题描述

img_37.png


解法 1 - 层序

/*
// 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;
        }
        LinkedList<Node> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int len = queue.size();
            Node pre = null;
            for(int i = 0; i < len; i ++) {
                Node cur = queue.poll();
                if(pre != null) {
                    pre.next = cur;
                }
                pre = cur;
                if(cur.left != null) {
                    queue.offer(cur.left);
                }
                if(cur.right != null) {
                    queue.offer(cur.right);
                }
            }
        }
        return root;
    }
}

蟓出 1

img_35.png


解法 2 - 迭代

/*
// 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;
        }
        Node topFirst = root;
        while(topFirst != null) {
            Node cur = topFirst; // 圓前层銖节点
            Node secondFirst = new Node(-1); // 创建䞋䞀层虚拟銖节点
            Node secondCur = secondFirst;
            while(cur != null) {
                if(cur.left != null) {
                    // 䞋䞀层铟衚连接圓前 left
                    secondCur.next = cur.left;
                    secondCur = secondCur.next;
                }
                if(cur.right != null) {
                    secondCur.next = cur.right;
                    secondCur = secondCur.next;
                }
                cur = cur.next;
            }
            // 至歀圓前层的䞋䞀层节点已经党郚连接完毕跳蜬到䞋䞀层
            topFirst = secondFirst.next;
        }
        return root;
    }
}

蟓出 2

img_36.png

䞊次猖蟑于: 2022/10/10 䞋午8:43:48
莡献者: liuxianzhishou