当前位置:网站首页>leetcode二叉搜索树与双向链表

leetcode二叉搜索树与双向链表

2022-08-09 18:52:00 老鱼37

在这里插入图片描述
思路:
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),开辟了一个数组来存储结点。

如有错误,多多指教!

原网站

版权声明
本文为[老鱼37]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_61342044/article/details/126235444