给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
看其他题解,说什么后续遍历,没怎么理解,一般做树这种东西,我都喜欢用递归。简单思路: 先把左子树搞成全部是右节点,再把右子树搞成全部是右节点,然后把左子树安到右子树,将左子树 搞成空的。 且每次返回都返回最后一个右叶子节点。
TreeNode* DFS(TreeNode* root)//返回排好的树的右节点
{
if (root == NULL)
return NULL;
else
{
TreeNode* temp1 = DFS(root->left);//排序左子树,返回左子树最右节点,如果为空,代表左子树不存在
TreeNode* temp2 = DFS(root->right);//排序右子树
if (!temp1 && !temp2)//左右都不存在
{
return root;//返回当前节点
}
else
{
if (!temp2)//左子树存在
{
root->right = root->left;
root->left = NULL;
return temp1;//返回左子树的最右节点
}
else if (!temp1)//右子树存在,左子树不存在
{
return temp2;//返回右子树的最右节点
}
else //左右子树都存在
{
temp1->right = root->right;//左子树的最右接到右子树
root->right = root->left;
root->left = NULL;//左边为空
return temp2;
}
}
}
}
void flatten(TreeNode* root)
{
DFS(root);
}