题目:将二叉树拆成链表
问题描述:将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。注意事项:不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
思路:当根节点或者左右子树为空时,返回空树;当左子树为空时,新建一个右节点赋值原二叉树跟的右孩子,递归下去;当右子树为空时,新建一个左节点赋值元二叉树的左孩子,把这个左节点赋值给跟的有孩子,递归下去,把left节点设置为空;当左右子树都不为空时,按前序遍历的顺序把所有的元素都放在右链表上。
代码:
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
void flatten(TreeNode *root) {
// write your code here
if(root==NULL) return;
if(root->left==NULL&&root->right==NULL) return;
if(root->left==NULL)
{
TreeNode *right=root->right;
flatten(right);
return;
}
if(root->right==NULL)
{
TreeNode *left=root->left;
root->right=left;
flatten(left);
root->left=NULL;//left节点设置为空
return;
}
//左右节点都不空
TreeNode *left=root->left;
TreeNode *right=root->right;
root->right=left;
flatten(left);
TreeNode *p=left;
while(p->right!=NULL)
{
//找到left部分的最右节点
p=p->right;
}
p->right=right;
flatten(right);
root->left=NULL;//left节点设置为空
return;
}
};
感想:这道题很麻烦,考虑的情况也要很多,但是把情况分清后每个小部分又很容易写出来。