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
Java:
1.征服代码:http://blog.youkuaiyun.com/linhuanmars/article/details/23510601
public void connect(TreeLinkNode root) {
if(root == null)
return;
TreeLinkNode lastHead = root;
TreeLinkNode pre = null;
TreeLinkNode curHead = null;
while(lastHead!=null)
{
TreeLinkNode lastCur = lastHead;
while(lastCur != null)
{
if(lastCur.left!=null)
{
if(curHead == null)
{
curHead = lastCur.left;
pre = curHead;
}
else
{
pre.next = lastCur.left;
pre = pre.next;
}
}
if(lastCur.right!=null)
{
if(curHead == null)
{
curHead = lastCur.right;
pre = curHead;
}
else
{
pre.next = lastCur.right;
pre = pre.next;
}
}
lastCur = lastCur.next;
}
lastHead = curHead;
curHead = null;
}
}
2.http://blog.youkuaiyun.com/muscler/article/details/22907093
/**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
public class Solution {
//dfs
public void connect(TreeLinkNode root) {
if (root == null) return;
//如果右孩子不为空,左孩子的next是右孩子。
//反之,找root next的至少有一个孩子不为空的节点
if (root.left != null) {
if (root.right != null) {
root.left.next = root.right;
}
else {
TreeLinkNode p = root.next;
while (p != null && p.left == null && p.right == null)
p = p.next;
if (p != null)
root.left.next = p.left == null ? p.right : p.left;
}
}
//右孩子的next 根节点至少有一个孩子不为空的next
if (root.right != null) {
TreeLinkNode p = root.next;
while (p != null && p.left == null && p.right == null)
p = p.next;
if (p != null)
root.right.next = p.left == null ? p.right : p.left;
}
connect(root.right);
connect(root.left);
}
}
3.http://blog.youkuaiyun.com/perfect8886/article/details/20874913
import java.util.LinkedList;
import java.util.Queue;
public class PopulatingNextRightPointersInEachNodeII {
public void connect(TreeLinkNode root) {
if (root == null) {
return;
}
Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
Queue<TreeLinkNode> nextQueue = new LinkedList<TreeLinkNode>();
queue.add(root);
TreeLinkNode left = null;
while (!queue.isEmpty()) {
TreeLinkNode node = queue.poll();
if (left != null) {
left.next = node;
}
left = node;
if (node.left != null) {
nextQueue.add(node.left);
}
if (node.right != null) {
nextQueue.add(node.right);
}
if (queue.isEmpty()) {
Queue<TreeLinkNode> temp = queue;
queue = nextQueue;
nextQueue = temp;
left = null;
}
}
}
}