剑指 Offer 36. 二叉搜索树与双向链表

  = >   

 

 

 将一棵BST转化为一个排序的双向循环链表,返回头结点,“head” 表示指向链表中有最小元素的节点。

由于是二叉搜索树,所以最左结点是最小元素的结点。

要有序,所以选择中序遍历。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;

    Node() {}

    Node(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
private:
    Node* head = nullptr;
    Node* tail = nullptr;
public:
    void inOrder(Node* root) {
        if(!root) return ;
        inOrder(root->left);  //遍历左子树这条递归可以找到最左结点
        if(!tail) head = root;  //将头指针指向最左节点
        else {
            tail->right = root;  //双向循环链表的关系指针
            root->left = tail;
        }
        tail = root;  //更新尾指针

        inOrder(root->right);
    }

    Node* treeToDoublyList(Node* root) {
        if(!root) return nullptr;
        inOrder(root);  //中序遍历整棵树
        head->left = tail; //将首尾结点建立连接 
        tail->right = head;

        return head;
    }
};

 

posted on 2021-02-10 10:35  hannah_id  阅读(53)  评论(0)    收藏  举报

导航