二叉搜索树与双向链表

class Solution {
public:
    TreeNode* pre=NULL;
    void dfs(TreeNode* root)
    {
        if(!root)   return;
        dfs(root->left);
        root->left=pre;
        if(pre) pre->right=root;
        pre=root;
        dfs(root->right);
    }
    TreeNode* convert(TreeNode* root) {
        dfs(root);
        while(root&&root->left) root=root->left;
        return root;
    }
};

方法2

class Solution {
public:
    TreeNode* convert(TreeNode* root) {
        if(!root)   return NULL;
        auto sides=dfs(root);
        return  sides.first;
    }
    pair<TreeNode*,TreeNode*> dfs(TreeNode* root)
    {
        //如果是叶子节点,那么双向链表的首尾节点都是自己
        if(!root->left&&!root->right)   return {root,root};
        if(root->left&&root->right)//左右子树都有
        {
            auto lsides=dfs(root->left),rsides=dfs(root->right);
            lsides.second->right=root;root->left=lsides.second;
            rsides.first->left=root;root->right=rsides.first;
            return {lsides.first,rsides.second};
        }
        else if(root->left)//如果只有左子树
        {
            auto lsides=dfs(root->left);
            lsides.second->right=root;root->left=lsides.second;
            return {lsides.first,root};
        }
        else//只有右子树
        {
            auto rsides=dfs(root->right);
            rsides.first->left=root;root->right=rsides.first;
            return {root,rsides.second};
        }
    }
};
posted @   穿过雾的阴霾  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示