Leetcode 116. 填充每個節點的下一個右側節點指標
阿新 • • 發佈:2020-11-16
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;
}
}