Populating Next Right Pointers in Each Node II
这道题思路总结一下:
感觉上是用了动态规划的思想,对于二叉树,不论是完全二叉树还是非完全二叉树,只要确定上一层所有相邻节点的关系。就可以把本层的链接关系确定。对于二叉树第一层是确定的。所以可以依次类推。确定所有二叉树层次的关系。
leetcode 代码实现详解
class Solution {
public:
typedef TreeLinkNode * Snode;
void connect(TreeLinkNode *root) {
if(root == NULL)
return ;
root->next = NULL;
if(root->left != NULL && root->right != NULL)
root->left->next = root->right;
TreeLinkNode parent(0);
parent.left = root;
rconnect(root,&parent);
}
void rconnect(TreeLinkNode *root,TreeLinkNode *parentroot)
{
connecthlevel(root,parentroot);
pair<Snode,Snode> temp;
temp=getfirst(parentroot);
if(temp.first == NULL)
return ;
rconnect(temp.first,temp.second);
}
pair<Snode,Snode> getfirst(TreeLinkNode *parentroot)
{
TreeLinkNode *ptemp = NULL;
while(parentroot != NULL)
{
if(parentroot->left != NULL)
{
ptemp = parentroot->left;
if(ptemp->left != NULL)
{
return pair<Snode,Snode>(ptemp->left,ptemp);
}
if(ptemp->right != NULL)
{
return pair<Snode,Snode>(ptemp->right,ptemp);
}
}
if(parentroot->right != NULL)
{
ptemp = parentroot->right;
if(ptemp->left != NULL)
{
return pair<Snode,Snode>(ptemp->left,ptemp);
}
if(ptemp->right != NULL)
{
return pair<Snode,Snode>(ptemp->right,ptemp);
}
}
parentroot = parentroot->next;
}
ptemp = NULL;
return pair<Snode,Snode>(ptemp,ptemp);
}
void connecthlevel(TreeLinkNode *root,TreeLinkNode *parentroot)
{
if(parentroot == NULL)
return ;
TreeLinkNode *ptemp,*pconnect;
ptemp = parentroot->next;
pconnect = root;
if(parentroot->right != NULL && root != parentroot->right)
{
pconnect->next = parentroot->right;
pconnect = parentroot->right;
}
while(ptemp != NULL)
{
if(ptemp->left != NULL)
{
pconnect->next = ptemp->left;
pconnect = ptemp->left;
}
if(ptemp->right != NULL)
{
pconnect->next = ptemp->right;
pconnect = ptemp->right;
}
ptemp = ptemp->next;
}
}
};
浙公网安备 33010602011771号