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.
- Recursive approach is fine, implicit stack space does not count as extra space for this problem.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
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
Follow up, what if the tree is not prefect binary tree.
这道题的follow up 中 binary tree不一定是完整的 所以root.right.next指向是不定的思路就是先找到root.right 右边第一个可行node存储注意这道题应该先遍历右边然后再左边
递归:
/**
* 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 dummy = new TreeLinkNode(0);
for (TreeLinkNode curr = root, prev = dummy; curr != null;
curr = curr.next) {
if (curr.left != null) {
prev.next = curr.left;
prev = prev.next;
}
if (curr.right != null) {
prev.next = curr.right;
prev = prev.next;
}
}
connect(dummy.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) {
while (root != null) {
TreeLinkNode next = null;
TreeLinkNode prev = null;
for (; root != null; root = root.next) {
if (next == null)
next = root.left != null ? root.left : root.right;
if (root.left != null) {
if (prev != null)
prev.next = root.left;
prev = root.left;
}
if (root.right != null) {
if (prev != null)
prev.next = root.right;
prev = root.right;
}
}
root = next;
}
}
}