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种层次遍历的其他方法。也看看这道题的其他解法。