问题描述
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.
- Recursive approach is fine, implicit stack space does not count as extra space for this problem.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
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
思路分析
给一个特殊的二叉树,多了一个指向同一层的右边结点的指针,一开始全为NULL,将这些指针合理的构建成应有的样子。
用两个指针循环二叉树,pre表示上一层的开始结点,cur用于将下一层的结点连接起来。因为一开始next都是NULL,所以root不用管,只需要判断有没有树。然后从root开始遍历即可,保证下一层有树的情况下,层序遍历整棵树。
代码
/**
* 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 *pre = root;
TreeLinkNode *cur = NULL;
while(pre->left){
cur = pre;
while(cur){
cur->left->next = cur->right;
if(cur->next)
cur->right->next = cur->next->left;
cur = cur->next;
}
pre = pre->left;
}
}
};
时间复杂度:
O(n)
O
(
n
)
空间复杂度:
O(1)
O
(
1
)
反思
很有意思的题目,也可以递归解决。
/**
* 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;
if(!root->left && !root->right) return;
if(root->left && root->right){
root->left->next = root->right;
if(root->next){
root->right->next = root->next->left;
}
}
connect(root->left);
connect(root->right);
}
};