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 toNULL
.
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题目:将满二叉树中,每一层的节点用指针连接起来。
分析:注意题目中的满二叉树,也就是说一个节点如果有左子树,那么它一定具有右子树,所以递归连接左右子树,右子树与相邻节点的左子树即可。
代码:
/**
* 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;//p可能为NULL
}
if(root->right && root->next){
root->right->next=root->next->left; //
}
connect(root->left);
connect(root->right);
}
};
Populating Next Right Pointers in Each Node II
Follow up for problem "Populating Next Right Pointers in Each Node".
What if the given tree could be any binary tree? Would your previous solution still work?
Note:
- You may only use constant extra space.
For example,
Given the following binary tree,
1 / \ 2 3 / \ \ 4 5 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ \ 4-> 5 -> 7 -> NULL题目:如果是普通的二叉树,如何将每一层的节点连接起来。
分析:不能直接用上面的方法,因为有左子树不一定有右子树。
基本思路,找到root节点的next中具有孩子的那些中的最左边的孩子。
代码:
class Solution {
public:
void connect(TreeLinkNode *root) {
if(root==NULL) return ;
TreeLinkNode *p=root->next;//p用来记录 root的next中 最左边的孩子
while(p){
if(p->left){p=p->left; break;}//如果某个next有左右孩子
if(p->right) {p=p->right; break;}
p=p->next;//否则继续往右找root的next中具有左右孩子的节点
}
if(root->right){ //将root的右孩子与p相连
root->right->next=p;//p可能为NULL
}
if(root->left){
root->left->next= root->right==NULL? p: root->right; //如果root->right为空,左的next为p,否则左的next为right。
}
connect(root->right);//先右后左
connect(root->left);
}
};