Populating Next Right Pointers in Each Node I
https://leetcode.com/problems/populating-next-right-pointers-in-each-node/
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.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For 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这道题就是利用上一层已经生成的next指针来遍历上一层的子节点,即当前层。另外,由于保证是完全二叉树,所以不需要考虑很多特殊情况:
public void connect(TreeLinkNode root){
if(root == null) return;
TreeLinkNode lasthead = root;
TreeLinkNode pre = null;
while(lasthead!=null){
TreeLinkNode curhead = lasthead.left;
TreeLinkNode lastcur = lasthead;
while(lastcur!=null && curhead!=null){
if(pre==null){
pre = lastcur.left;
}
else{
pre.next = lastcur.left;
pre = pre.next;
}
pre.next = lastcur.right;
pre = pre.next;
lastcur = lastcur.next;
}
lasthead = curhead;
pre = null;
}
}
Populating Next Right Pointers in Each Node II
https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
这道题跟上一道题差不多,区别在于不保证是完全二叉树,因此要考虑子节点为null的情况。
public void connect(TreeLinkNode root){
if(root==null) return;
TreeLinkNode lasthead = root;
TreeLinkNode curhead = null;
TreeLinkNode pre = null;
while(lasthead!=null){
TreeLinkNode lastcur = lasthead;
while(lastcur!=null){
if(lastcur.left!=null){
if(curhead==null){
curhead=lastcur.left;
pre = lastcur.left;
}
else{
pre.next = lastcur.left;
pre = pre.next;
}
}
if(lastcur.right!=null){
if(curhead==null){
curhead=lastcur.right;
pre = lastcur.right;
}
else{
pre.next = lastcur.right;
pre = pre.next;
}
}
lastcur = lastcur.next;
}
lasthead = curhead;
curhead = null;
pre = null;
}
}