leetcode 二叉搜索树与双向链表 中等

 

 

首先很容易想到的一种做法就是:用 vector 将所以树结点按照中序遍历的方式存下来,然后遍历 vector 链接即可。(二叉搜索树中序遍历是按 val 顺序保存的)

也就是说:

void solve(Node *root) {
    if(!root) return ;
    solve(root -> left);
    printf("%d ", root -> val);
    solve(root -> right);
}

这样子,printf 出来的 val 是有序的。所以只需要利用一个变量来保存前驱即可。

如果在 solve(root -> left) 与 solve(root -> right) 中间,pre 的值不是空,那么就有前驱,链接起来就行。

但是题目还要求最小的和最大的相连,所以 pre 出现为空的情况,即到达最小节点处,保存 minNode...

遍历完后的 pre 就是在最大节点处

class Solution {
public:
    Node* treeToDoublyList(Node* root) {
        if(!root) return root;
        minNode -> left = pre;
        pre -> right = minNode;
        return minNode;
    }

private:
    Node *pre = nullptr, *minNode = nullptr;

    void solve(Node *root) {
        if(!root) return ;
        solve(root -> left);
        if(pre) pre -> right = root;
        else minNode = root;
        root -> left = pre;
        pre = root;
        solve(root -> right);
    }
};

 

posted @ 2021-09-21 13:36  rookie_Acmer  阅读(28)  评论(0编辑  收藏  举报