不难的一道题,但是我始终没想出如何用常数空间来完成……
我使用了广搜的办法,思路特别简单,要点是每层放入队列以后在最后面插入一个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;
deque<TreeLinkNode *> d;
d.push_back(root);
d.push_back(NULL);
while (!d.empty()) {
TreeLinkNode *t = d.front();
d.pop_front();
if (t->left != NULL && t->right != NULL) {
d.push_back(t->left);
d.push_back(t->right);
}
if (d.front() == NULL) {
d.pop_front();
if (d.empty())
break;
d.push_back(NULL);
continue;
}
else {
t->next = d.front();
}
}
}
};
网上还看到一个更好的方法,把需要连接的节点在他们共同祖先那一层一起处理,利用递归来结题。
http://blog.youkuaiyun.com/havenoidea/article/details/12840497
/**
* 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)
{
TreeLinkNode *l=root->left,*r=root->right;
while(l!=NULL)
{
l->next=r;
l=l->right;
r=r->left;
}
connect(root->left);
connect(root->right);
}
}
};
// blog.youkuaiyun.com/havenoidea
http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/