力扣114题:二叉树展开链表

力扣114题:二叉树展开链表

题目描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

输入输出样例

在这里插入图片描述

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
输入:root = []
输出:[]
输入:root = [0]
输出:[0]

解法一:不考虑空间复杂度使用递归

void preOrderTraversal(TreeNode *root,vector<TreeNode*>&treeList)
{
   
    if(!root)
    {
   
        return;
    }
    treeList.push_back(root);
    preOrderTraversal(root->left,treeList);
    preOrderTraversal(root->right,treeList);
}


//使用前序遍历实现
//对树进行前序遍历保存到临时的数组中,然后再将数组中的数据,重新写到另一颗树上去
void flatten2(TreeNode *&root)
{
   
    vector<TreeNode*>treeList;
    preOrderTraversal(root,treeList);
    //获取结点数组的长度
    int length=treeList.size();

    //跳过根节点
    for(int i=1;i<length;i++)
    {
   
        TreeNode *prev=treeList[i-1];
        TreeNode*curr=treeList[i];
        prev->right=curr;
        prev->left=nullptr;
    }
}

解法二,不考虑空间复杂度借用堆栈使用迭代


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值