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 toNULL
.
Initially, all next pointers are set toNULL
.
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
Analysis
Non-recursion
非递归的方法就是遍历Binary Tree,由于条件限制不能用额外空间extra space,因此level order BFS 所需的queue就不能用了。好在这一题中每层之间最终都会通过指针连接起来,也就让一行之内的遍历成为可能。
在上一层的节点连接起来之后就可以遍历该层,并且连接下一层的子节点。连接子节点分为两种情形:
该节点的右子节点和同层邻近下一个节点的左子节点相连接
层内移动指针:
转到下一层:
levelStart = levelStart.left;
Recursion
递归的inexplicit的调用栈不在题目条件的限制内,因此也可以用递归。
递归函数的逻辑其实挺简单,就是把节点1连接到节点2
Solution
Use level start TreeLinkNode - O(1) space, O(n) time
/**
* 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 levelStart = root;
// Move across level
while (levelStart != null) {
TreeLinkNode curr = levelStart;
// Move within level
while (curr != null) {
if (curr.left != null) curr.left.next = curr.right;
if (curr.right != null && curr.next != null) curr.right.next = curr.next.left;
curr = curr.next;
}
levelStart = levelStart.left;
}
}
}
Use recursion - (3ms 29.60%)
public class Solution {
public void connect(TreeLinkNode root) {
if (root == null) {
return;
}
connectHelper(root.left, root.right);
}
private void connectHelper(TreeLinkNode node1, TreeLinkNode node2) {
if (node1 == null || node2 == null) {
return;
}
node1.next = node2;
connectHelper(node1.left, node1.right);
connectHelper(node1.right, node2.left);
connectHelper(node2.left, node2.right);
}
}