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 -> NULLTree Depth-first Search
题目地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/
解题思路:
这道题的第一个解法是自己解出来的,还是挺开心的,毕竟还是个难度系数是medium的题呢哈哈^_^
第一种解法:利用二叉树层序遍历的思想,先按层序遍历的顺序把每个节点连起来。然后把每一层的最右的节点的next都指向NULL(因为是满二叉树,所以直接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) {
//可以采用层序遍历的方法把所有结点按层序遍历的顺序连接
//然后把所有的最右结点的next置为null
if(root == NULL) return;
queue<TreeLinkNode *> Q;
Q.push(root);
while(!Q.empty()){
TreeLinkNode *cur = Q.front();
Q.pop();
if(!Q.empty()) cur->next = Q.front();
if(cur->left) Q.push(cur->left);
if(cur->right) Q.push(cur->right);
}
TreeLinkNode *p = root;
while(p){
p->next = NULL;
p = p->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) return;
//如果左节点非空,将左节点连接到右节点
if(root->left){
root->left->next = root->right;
}
//如果右节点非空就将右节点的next连接到...结合上图的5,6节点看
if(root->right && root->next){
root->right->next = root->next->left;
}
connect(root->left);
connect(root->right);
}
};