题目地址:https://oj.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解题思路:这道题可以用层次遍历二叉树来解答。在二叉树的每一层的节点个数是2的i次方,(i>=0&&i<=树的层次),因此需要在设置一个变量来保存每一层的节点个数,当每一层的节点访问完之后,可得到每一层的最后节点,然后对最后一个节点操作即可。
public void connect(TreeLinkNode root) {
if (root == null)
return;
root.next = null;
int count=2;
TreeLinkNode p=root;
TreeLinkNode q=null;
Queue
que= new LinkedList
();
if (p.left != null)
que.add(p.left);
if (p.right != null)
que.add(p.right);
while(!que.isEmpty()){
int temp=count;
while((temp!=0)&&!que.isEmpty()){
p=que.poll();
if(p.left!=null)
que.add(p.left);
if(p.right!=null)
que.add(p.right);
if(q!=null){
q.next=p;
}
q=que.poll();
if(q.left!=null){
que.add(q.left);
}
if(q.right!=null)
que.add(q.right);
temp-=2;
p.next=q;
}
if(temp<=0){
q.next=null;
}
q=null;
count=2*count;
}
}