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:
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
public void connect(TreeLinkNode root) { if (null == root) { return; } TreeLinkNode cur = root.next; TreeLinkNode p = null; while (cur != null) { // find last right node (left or right) if (cur.left != null) { p = cur.left; break; } if (cur.right != null) { p = cur.right; break; } cur = cur.next; } if (root.right != null) { root.right.next = p; } if (root.left != null) { root.left.next = root.right != null ? root.right : p; } connect(root.right); // from right to left connect(root.left); }
public void connect(TreeLinkNode root) { if (null == root) { return; } LinkedList<TreeLinkNode> Q = new LinkedList<TreeLinkNode>(); // save one // line // root(s) LinkedList<TreeLinkNode> Q2 = new LinkedList<TreeLinkNode>(); ; // save next one line root(s), swap with Q Q.push(root); while (!Q.isEmpty()) { TreeLinkNode tmp = Q.getFirst(); Q.pop(); if (tmp.left != null) Q2.add(tmp.left); if (tmp.right != null) Q2.add(tmp.right); if (Q.isEmpty()) { tmp.next = null; LinkedList<TreeLinkNode> tmpQ = Q; // swap queue Q = Q2; Q2 = tmpQ; } else { tmp.next = Q.getFirst(); } } }注意点:
public void connect(TreeLinkNode root) { LinkedList<TreeLinkNode> queue = new LinkedList<TreeLinkNode>(); if (root == null) return; TreeLinkNode p; queue.add(root); queue.add(null);// flag while (!queue.isEmpty()) { p = queue.pop(); if (p != null) { if (p.left != null) { queue.add(p.left); } if (p.right != null) { queue.add(p.right); } p.next = queue.getFirst(); } else { if (queue.isEmpty()) { return; } queue.add(null); } } }
LeetCode 117 Populating Next Right Pointers in Each Node II
原文地址:http://blog.csdn.net/mlweixiao/article/details/40649871