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
这题说只能使用额外的常数空间,然后允许递归解决问题,好的那就递归吧
solution:
public class Solution {
public void connect(TreeLinkNode root) {
if(root!=null){
if(root.left==null)//判断当前根节点是否有子节点
return;
root.left.next = root.right;
if(root.next!=null){
root.right.next = root.next.left;
}
connect(root.left);
connect(root.right);
}
}
}
参考样例图可以发现规律,对于同一棵树,左节点的next指向右节点,如果是右节点的话,判断根节点的next是否指向一个节点,
该节点应该为另一个树的根节点,如果是的话,让右节点的next指向该节点的左节点,然后递归对每一个根节点做此处理就可以得到结果.
能做这两项操作的原因是因为题目里说了每一个节点的next默认为null,所以很好判断其是否存在,其次说了该树是一个完美二叉树
即所有叶子节点都在同一层,每个父节点都有两个子节点(注:但是你还是要判断一个每个根节点是否有子节点,有卡ac的测试数据)