Populating Next Right Pointers in Each Node

Given a binary tree

    struct TreeLinkNode {
      TreeLinkNode *left;
      TreeLinkNode *right;
      TreeLinkNode *next;
    }

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Note:

  • You may only use constant extra space.
  • You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).

For example,
Given the following perfect binary tree,

         1
       /  \
      2    3
     / \  / \
    4  5  6  7

After calling your function, the tree should look like:

         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \  / \
    4->5->6->7 -> NULL
要將原來的TreeNode增加一個next指針 指向其同層的下一個 很明顯地想到是用層序遍歷的方法 代碼如下:
/**
 * 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 ;
		int count=1;
		int level=0;
		Queue<TreeLinkNode> que =new LinkedList<TreeLinkNode>();
		que.offer(root);
		while(que.isEmpty()!=true){
			level=0;
			for(int i=0;i<count;i++){
				root=que.peek();
				que.poll();
				if(i<count-1){
				    root.next=que.peek();
				}else{
				    root.next=null;
				}
				if(root.left!=null){
					que.offer(root.left);
					que.offer(root.right);
					level++;
					level++;
				}
			}
			count=level;
		}
    }
}
原來題中要求的是空間複雜度爲0(1) 但遍歷的話空間複雜度爲O(log N)上面方法不滿足要求 從例子來看 每一層的next設置都可以根據自身和上一層的結果來設置 所以採用遞歸即可 代碼如下:
public class Solution {
    public void connect(TreeLinkNode root) {
        if(root==null)return ;
        if(root.left!=null){
            root.left.next=root.right;
        }
        if(root.right!=null&&root.next!=null){
            root.right.next=root.next.left;
        }else{
            if(root.right!=null){
                root.right.next=null;
            }
        }
        connect(root.left);
        connect(root.right);
    }
}


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