【题目】
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为右孩子,否则为null
【分析】
由于只能用常量级别的额外存储空间,所以深度搜索是不能用的,因为递归是需要栈的,因此空间复杂度将是 O(logn)。同理广度搜索也不能用,因为队列也是占用空间的,空间占用还高于 O(logn)。但是核心仍然是广度搜索,但是我们可以借用 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(NULL == root) return;
TreeLinkNode* curLev;
while(root -> left != NULL){
curLev = root;
while(curLev != NULL){
curLev -> left -> next = curLev -> right;
if(curLev -> next != NULL)
curLev -> right -> next = curLev -> next -> left;
curLev = curLev -> next;
}
root = root -> left;
}
}
};
参考:
思路:
很棒的一道题,可以认为是先序遍历。
(1)根据题述:左孩子为空,则右孩子一定为空,所以左孩子为空,则return
(2)如果左孩子不为空,则右孩子一定不为空,所以链接左孩子和右孩子即可(左孩子的next赋值为右孩子)
(3)由于先序遍历,所以父节点的next比子节点的next先被设置,故父节点不同的两个子节点进行连接,就可以用到父节点的next,整题的精华便是:root->right->next = root->right
/**
* 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 || root -> left == NULL) {
return;
}
root->left->next = root->right;
if(root->next != NULL) {
root->right->next = root->next->left;
}
connect(root->left);
connect(root->right);
return;
}
};