1.populating-next-right-pointers-in-each-node-ii
题目描述:填充所有节点的next指针,指向它右兄弟节点。如果没有右兄弟节点,则应该将next指针设置为NULL。初始时,所有的next指针都为NULL
注意:你只能使用常量级的额外内存空间;可以假设给出的二叉树是一个完美的二叉树(即,所有叶子节点都位于同一层,而且每个父节点都有两个孩子节点)。
解题思路:我的解题思路就是我永远也忘不掉的(田老师)层次遍历思路父结点出队,子节点依次入队,只需要根据完美二叉树性质,找准每一层最后一个结点即可。
不管方法是不是最简洁的,本题写好代码一遍过令人开熏!
2.populating-next-right-pointers-in-each-node-ii
题目描述:
继续思考"Populating Next Right Pointers in Each Node".这道题
如果给定的树可以是任意的二叉树呢?你之前的给出的算法还有效吗?
注意:你只能使用常量的额外内存空间
解题思路:我的解题思路就是在上一道题层次遍历结点依次入队的基础上,再加入一个临界隔板结点也让他入队,标志着这一层结束。
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
public void connect(TreeLinkNode root) {
//层序遍历,pre记录上一个兄弟,层切换时断链
Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();
if(root==null) return ;
queue.add(root);
TreeLinkNode pre = root;
TreeLinkNode tail = new TreeLinkNode(-65535); //分层隔断点
queue.add(tail);
while(!queue.isEmpty() && pre!=tail){
TreeLinkNode node = queue.poll();
if(pre!=node){
pre.next = node;
pre = pre.next;
}
if(node.left!=null) //左孩子入队
queue.add(node.left);
if(node.right!=null){ //右孩子入队
queue.add(node.right);
}
if(queue.peek().val==-65535){//当前点是层尾
node.next = null;
tail = queue.poll();
queue.add(tail);
pre = queue.peek(); //下一层头
}
}
}
}层次遍历我田老师当时讲的思路在我脑海中真的是根深蒂固,以至于形成思维定式,我才发现思维被固化也是一件很难受的事,于是我决定去强行找2种层次遍历的其他方法。也看看这道题的其他解法。



京公网安备 11010502036488号