【剑指Offer-36】二叉搜索树与双向链表

问题

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

示例

解答1:递归

class Solution {
public:
    Node* treeToDoublyList(Node* root) {
        if (!root) return NULL;
        recur(root);
        head->left = pre;
        pre->right = head;
        return head;
    }
private:
    Node *head = NULL, *pre = NULL;
    void recur(Node* root) {
        if (!root) return;
        recur(root->left);
        // ------ 中序操作
        root->left = pre;
        if (pre) pre->right = root;
        else head = root;
        pre = root;
        // ------
        recur(root->right);
    }
};

重点思路

只要能想到使用一个全局节点pre来表示上一个节点,这道题就迎刃而解了。需要注意的是,声明指针时一定要初始化(被折磨,说多了都是泪)。

解答2:迭代

class Solution {
public:
    Node* treeToDoublyList(Node* root) {
        if (!root) return NULL;
        Node *head = NULL, *pre = NULL, *cur = root;
        stack<Node*> s;
        while (!s.empty() || cur) {
            while (cur) {
                s.push(cur);
                cur = cur->left;
            }
            cur = s.top(); s.pop();
            // ------ 中序操作
            if (pre) pre->right = cur;
            else head = cur;
            cur->left = pre;
            pre = cur;
            // ------
            cur = cur->right;
        }
        head->left = pre;
        pre->right = head;
        return head;
    }
};
posted @ 2021-02-28 17:17  tmpUser  阅读(42)  评论(0编辑  收藏  举报