leetcode二叉搜索树与双向链表

在这里插入图片描述
思路:
1.创建一个新数组
2.中序遍历二叉树 将值放入数组里面
3.遍历数组将值放入双向链表中 建立双向关系

//链表题目已经给出,这里是为了给予展示
//创建一个链表
// struct TreeNode
// {
//     int val;
//     struct TreeNode*left;
//     struct TreeNode*right;
//     TreeNode(int x)
//     {
//         val=x;
//         left=NULL;
//         right=NULL;
//     }
        
// };
class Solution {
public:
    //创建一个数组
    vector<TreeNode*>st;
    void Inorder(TreeNode*root)
    {
        if(!root) return;
        Inorder(root->left);
        st.push_back(root);
        Inorder(root->right);
    }
    TreeNode* Convert(TreeNode* pRootOfTree) {
        //中序遍历二叉树然后放入数组里面,然后遍历数组放入双向链表中
        if(!pRootOfTree) return pRootOfTree;
        Inorder(pRootOfTree);//中序遍历
        
        //根据数组中的顺序将结点连接,注意i的范围
        for(int i=0;i<st.size()-1;i++)
        {
            st[i]->right=st[i+1];//连接关系
            st[i+1]->left=st[i];//连接关系
        }
        return st[0];
        
    }    
};

时间复杂度:O(N),等于中序遍历的时间复杂度。
空间复杂度:O(N),开辟了一个数组来存储结点。

解法二:
在树上动手脚,创建一个头指针,一个头指针的前一个指针

遍历左树,找到最左边的是树中最小的数,然后就是链表的头
遍历右树,找到最右边的是树中最大的数,然后就是链表的尾
然后依靠pre指针串联起来,最后输出链表头

class Solution {
public:
    //返回的第一个指针,初值为最小值,为NUNLL
    TreeNode*head=NULL;
    //中序遍历当前值的上一位,初值为最小值,为NULL
    TreeNode*pre=NULL;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree==NULL)
        {
            //中序递归
            return NULL;
        }
        
        Convert(pRootOfTree->left);
        //找到左树最左最小值  
        if(pre==NULL)
        {
            head=pRootOfTree;
            pre=pRootOfTree;
        }
        else
        {
            pre->right=pRootOfTree;
            pRootOfTree->left=pre;
            pre=pRootOfTree;//pre等于新的root值
        }
        //遍历右树
        Convert(pRootOfTree->right);
        return head;
    }
};

时间复杂度:O(N),等于中序遍历的时间复杂度。
空间复杂度:O(N),开辟了一个数组来存储结点。

如有错误,多多指教!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值