1 解题思想
这道题和116基本一样:
Leetcode 116. Populating Next Right Pointers in Each Node 链接邻居 解题报告
区别在于这个是任意二叉树,但是我在116中说的方法是通用的(这两道题我已经做了4个月多了,很多细节记不清了,现在回过头看,我刚刚在116中解题思想对116和117通用)
总之BFS+高度记录+保留上一个遍历的节点,然后连接合法节点
我要加速更新了,之前都做了好几个月都拖着没写解题报告,到后面我自己都记不得了。。哎
2 原题
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:
You may only use constant extra space.
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
3 AC解
/**
* Definition for binary tree with next pointer.
* public class TreeLinkNode {
* int val;
* TreeLinkNode left, right, next;
* TreeLinkNode(int x) { val = x; }
* }
*/
/**
* 多一个技巧,比起上一个,上一个是计数法来看层高,这道题使用一个队列来同步的记录层高,同样是BFS
* 要是下一个队列的开头的层高和当前不一样,那么就是证明换层了
* */
public class Solution {
public void connect(TreeLinkNode root) {
Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
Queue<Integer> height = new LinkedList<Integer>();
if(root!=null){
queue.add(root);
height.add(0);
}
while(queue.isEmpty()==false){
TreeLinkNode tmp=queue.poll();
int currentHeight=height.poll();
if(height.peek()==null || height.peek()!=currentHeight){
tmp.next=null;
}
else {
tmp.next=queue.peek();
}
if(tmp.left!=null) { queue.add(tmp.left); height.add(currentHeight+1);}
if(tmp.right!=null) {queue.add(tmp.right); height.add(currentHeight+1);}
}
}
}