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
这道题和上一道题的区别在于,上一道的树是满二叉树,这一个并不是。
还是先使用队列做了一次,ac但是速度并不是很快。
/** * 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 ; Queue queue = new LinkedList<TreeLinkNode>(); queue.add(root); while( !queue.isEmpty() ){ int size = queue.size(); TreeLinkNode node1 = (TreeLinkNode) queue.poll(); if( node1.left != null ) queue.add(node1.left); if( node1.right != null) queue.add(node1.right); if( size == 1) continue; TreeLinkNode node2 = (TreeLinkNode) queue.poll(); if( node2.left != null ) queue.add(node2.left); if( node2.right != null) queue.add(node2.right); for( int i = 2;i<size;i++){ node1.next = node2; node1 = node2; node2 = ( TreeLinkNode ) queue.poll(); if( node2.left != null ) queue.add(node2.left); if( node2.right != null) queue.add(node2.right); } node1.next = node2; } } }
但是题目中要求是常数空间。
所以还需要修改。
记录上一行的开始和下一行的开始,然后依次改变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 ; TreeLinkNode low = null ;//指的是下面一行的第一个结点 TreeLinkNode up = root; if( root.left != null ) low = root.left; else if( root.right != null ) low = root.right; while( low != null ){ TreeLinkNode start = low; TreeLinkNode upStart = up; helper(start,upStart); while( low != null ){ if( low.left != null ){ TreeLinkNode node = low.left; up = low; low = node; break; } if( low.right != null ){ TreeLinkNode node = low.right; up = low; low = node; break; } low = low.next; } } } public void helper(TreeLinkNode start,TreeLinkNode upStart){ if( upStart.left != null){ if( upStart.right != null){ start.next = upStart.right; start = start.next; } } upStart = upStart.next; while( upStart != null ){ if( upStart.left != null ){ start.next = upStart.left; start = start.next; if( upStart.right != null ){ start.next = upStart.right; start = start.next; } }else if( upStart.right != null ){ start.next = upStart.right; start = start.next; } upStart = upStart.next; } } }