您的位置:首页 > 其它

114. Flatten Binary Tree to Linked List

2016-11-12 10:15 197 查看


第一种方案:先序遍历整棵树,然后从根节点开始一直往右子树延伸。

class Solution {
public:
void flatten(TreeNode* root)
{
vector<int>pre;
preorder(root,pre);
TreeNode *pnode=root;
TreeNode *pnode_pre=root;
for(int i=0;i<pre.size();i++)
{
if(pnode)
{
pnode->val=pre[i];
pnode->left=NULL;
}
else
{
pnode=new TreeNode(pre[i]);
pnode->right=NULL;
pnode_pre->right=pnode;
}
pnode_pre=pnode;
pnode=pnode->right;
}
}
void preorder(TreeNode *root,vector<int>&pre)
{
if(!root)
return;
pre.push_back(root->val);
preorder(root->left,pre);
preorder(root->right,pre);
}
};


第二种方案:按照题意从根节点开始,如果当前节点有左孩子,就将它的左孩子添加到自己和右孩子之间,这里每次需要找到左孩子最右边的节点,连接到当前节点的右孩子。然后依次往右处理自己的右孩子,直到右孩子为空。

class Solution {
public:
void flatten(TreeNode* root)
{
if(root=NULL)
return;
while(root!=NULL)
{
if(root->left)
{
TreeNode *p=root->left;
while(p->right)
p=p->right;
p->right=root->right;
root->right=p;
root->left=NULL;
}
root=root->right;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度优先遍历