版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hy971216/article/details/82657484
给定一个二叉树
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
说明:
你只能使用额外常数空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。
示例:
给定完美二叉树,
1
/ \
2 3
/ \ / \
4 5 6 7
调用你的函数后,该完美二叉树变为:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
- 如果一个子节点是根结点的左子树,那么他的next就是该根结点的右子树
- 如果一个子结点是根结点的右子树,那么他的next就是该根结点next结点的左子树。
/**
* 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 == NULL) {
return;
}
TreeLinkNode* p = root;
TreeLinkNode* first = NULL;
while(p) {
//记录第一个左子树
if(first == NULL) {
first = p->left;
}
//如果有左子树,那么next就是父节点
if(p->left) {
p->left->next = p->right;
} else {
break;
}
//如果有next,则设置右子树的next
if(p->next) {
p->right->next = p->next->left;
p = p->next;
continue;
} else {
//转到下一层
p = first;
first = NULL;
}
}
}
};