AcWing 49. 二叉搜索树与双向链表(剑指offer)

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

要求不能创建任何新的结点,只能调整树中结点指针的指向。

注意:

需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

思路: 常规的递归遍历左右子树。
看到比较好的解法是利用中序遍历。二叉搜索树中序遍历完就是有序的了,可以在中序遍历的过程中确定好左右关系。

class Solution {
public:
    TreeNode* convert(TreeNode* root) {
        if(!root) return root;
        auto ans = dfs(root);
        return ans.first;
    }
    pair<TreeNode*,TreeNode*> dfs(TreeNode* root) {
        if(root -> left && root -> right) {
            auto Left = dfs(root -> left);
            auto Right = dfs(root -> right);
            Left.second -> right = root;
            root -> left = Left.second;
            root -> right = Right.first;
            Right.first -> left = root;
            return {Left.first,Right.second};
        }
        else if(root -> left) {
            auto Left = dfs(root -> left);
            Left.second -> right = root;
            root -> left = Left.second;
            return {Left.first,root};
        }
        else if(root -> right) {
            auto Right = dfs(root -> right);
            root -> right = Right.first;
            Right.first -> left = root;
            return {root,Right.second};
        }
        else {
            return {root,root};
        }
    }
};
发布了844 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/104950897