Populating Next Right Pointers in Each Node II (Java)

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);
    }





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章