每个节点的右向指针
给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
说明:
- 你只能使用额外常数空间。
- 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
- 你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。
示例:
给定完美二叉树,
1
/ \
2 3
/ \ / \
4 5 6 7
调用你的函数后,该完美二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
分析
最开始我还是使用之前写层次遍历的方法写的,两个队列,维护当前层节点和下一层节点,然后将队列元素全部指向下一个即可。虽然最后也A了,但是效率低的很,感觉很笨重。
参考了一下前排大佬们的写法,改成使用递归实现。
如上面的完美二叉树示例,先2->3,在通过2->3的关系建立5->6的关系,也就是root.right.next = root.next.left;
代码
/**
* 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) {
/*
Queue<TreeLinkNode> queue = new LinkedList<>();
Queue<TreeLinkNode> nextQueue = new LinkedList<>();
if(root == null){
return;
}
queue.add(root);
while(!queue.isEmpty()){
TreeLinkNode node = queue.remove();
if(node.left!=null){
nextQueue.add(node.left);
}
if(node.right!=null){
nextQueue.add(node.right);
}
if(!queue.isEmpty()){
node.next = queue.peek();
}else{
node.next = null;
Queue<TreeLinkNode> temp = nextQueue;
nextQueue = queue;
queue = temp;
}
}*/
if(root==null)
return;
if(root.left!=null){
root.left.next = root.right;
if(root.next!=null){
root.right.next = root.next.left;
}
}
connect(root.left);
connect(root.right);
}
}