题目描述 给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充所有节点的next指针,指向最接近它的同一层右边节点。如果没有同一层没有右边的节点,则应该将next指针设置为NULL。 初始时,所有的next指针都为NULL 注意: 你只能使用常量级的额外内存空间
可以假设给出的二叉树是一个完美的二叉树(即,所有叶子节点都位于同一层,而且每个父节点都有两个孩子节点)。
/**
* Definition for binary tree with next pointer.
* struct TreeLinkNode {
* int val;
* TreeLinkNode *left, *right, *next;
* TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
* };
*/
class Solution {
public:
void connect(TreeLinkNode *root) {
if(!root){
return;
}
//完美二叉树!
while(root->left != NULL){
TreeLinkNode *temp = root;
//层次遍历,加上next
while(temp != NULL){
temp->left->next = temp->right;
if(temp->next){
temp->right->next = temp->next->left;
}
temp = temp->next;
}
//开始下一层
root = root->left;
}
}
};
原因分析
- 第一次,错在开始下一层遍历时,继续使用了temp
- 第二次,错在发现了第一次错误,直接将temp的申明放到了循环外,不想改第一次的问题
- 仔细想过后,temp和root指针维护的不是同一个节点了。temp在指向null的时候就不能回头了。