1. 程式人生 > 實用技巧 >Leetcode 116. 填充每個節點的下一個右側節點指標

Leetcode 116. 填充每個節點的下一個右側節點指標

Leetcode 116. 填充每個節點的下一個右側節點指標

資料結構定義:

給定一個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
填充它的每個 next 指標,讓這個指標指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指標設定為 NULL。

初始狀態下,所有next 指標都被設定為 NULL。  
/*
// 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;
        }
        if(root.left != null){
            root.left.next = root.right;
            root.right.next = Objects.isNull(root.next) ? null : root.next.left;
            connect(root.left);
            connect(root.right);
        }
        return root;
    }
}

雙指標遞迴:

class Solution {
    /*
    * 思路: node 表示向下的指標, leftMost 表示同層級的指標
    * 每一次node指標遍歷 ,leftMost連線同層級的所有節點
    */
    public Node connect(Node root) {
        if(root == null){
            return null;
        }
        Node node = root;
        while(node != null){
            Node leftMost = node;
            while(leftMost != null){
                if(leftMost.left != null){
                    leftMost.left.next = leftMost.right;
                    leftMost.right.next = leftMost.next == null ? null:leftMost.next.left;
                }
                leftMost = leftMost.next;
            }
            node = node.left;
        }
        return root;
    }
}

運用佇列進行迭代

class Solution {
    public Node connect(Node root) {
        if(root == null) {return null;}
        Queue<Node> queue  =new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i =0;i<size;i++){
                Node node = queue.poll();
                if(i< size -1){
                    node.next = queue.peek();
                }
                if(node.left != null){
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
            }
        }
        return root;
    }
}