Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL
層序遍歷,置pre代表上一個節點,層序最後一個置pre爲null,如果pre爲null,不管它,如果pre不爲null,則將pre.next置爲當前節點,注意每層最後一個元素,不僅要將pre.next置爲當前節點,還需將當前節點下一節點置爲null。
Source
/**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
public class Solution {
public void connect(TreeLinkNode root) {
if(root == null) return;
LinkedList<TreeLinkNode> st = new LinkedList<TreeLinkNode>();
st.add(root);
int cur = 1;
int next = 0;
TreeLinkNode pre = new TreeLinkNode(0);
while(!st.isEmpty()){
TreeLinkNode temp = st.poll(); //poll和pop都是刪隊首
cur --;
if(temp.left != null){
st.add(temp.left); //add是隊尾加 push是隊首加
next++;
}
if(temp.right != null){
st.add(temp.right);
next++;
}
if(cur == 0){
cur = next;
next = 0;
if(pre != null) pre.next = temp; //該層只有一個節點
temp.next = null;
pre = null;
continue;
}
if(pre != null) pre.next = temp;
pre = temp;
}
}
}
Test
public static void main(String[] args){
TreeLinkNode root = new TreeLinkNode(1);
root.left = new TreeLinkNode(2);
root.left.left = new TreeLinkNode(4);
root.left.right = new TreeLinkNode(5);
root.right = new TreeLinkNode(3);
root.right.right = new TreeLinkNode(7);
new Solution().connect(root);
dfs(root);
}
public static void dfs(TreeLinkNode root){
if(root == null) return ;
if(root.next != null) System.out.println(root.next.val);
else System.out.println("#");
dfs(root.left);
dfs(root.right);
}