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
昨天晚上做完这道题,解法见http://blog.csdn.net/shiquxinkong/article/details/17724151,翻来覆去想别的办法,突然想到在说明这个题的时候说到“同层”的概念,就想到next就正好是串联层的关键,而下层恰好可以利用上层来实现,那么我们就可以利用已经设置好的上层的next域来实现下层的操作,说的有点拗口,没关系,看个图就明了了。
接下来:
继续:
好了,这棵树的连接完成了,还是建议自己画一下,体会下过程。
//code
/**
* 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) {
//NULL or has no children, nothing to do.
if(root == NULL || root->left == NULL)
return;
TreeLinkNode *p = root;
while(p != NULL)
{
p->left->next = p->right;
if(p->next)
p->right->next = p->next->left;
p = p->next;
}
connect(root->left);
}
};
这个问题的非递归程序如下:
class Solution {
public:
void connect(TreeLinkNode *root) {
//NULL or has no children, nothing to do.
if(root == NULL || root->left == NULL)
return;
while(root){
if(root->left == NULL) return;
TreeLinkNode *p = root;
while(p != NULL)
{
p->left->next = p->right;
if(p->next)
p->right->next = p->next->left;
p = p->next;
}
root = root->left;
}
}
};
后记:在写完这个code后还是有点小兴奋,百度了下这个问题的解法,发现了原来这个解法还是已经存在了的,可见<<圣经>>里说的话还是有道理的,里面讲到“已有的事后必再有,已行的事后必再行,日光之下并无新事”,一切皆属空虚。
附:http://leetcode.com/2010/03/first-on-site-technical-interview.html