二叉搜索树与双向链表

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

思路:

二叉搜索树的中序遍历结果就是排序的。所以对二叉树进行中序遍历,遍历的过程中进行指针的调整,遍历完成就调整完毕。

代码:

/*
// 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* pre;
    Node* head;
public:
    void turnup(Node* cur) {
        if (cur == nullptr) {
            return;
        }
        turnup(cur->left);
        if (head == nullptr) {
            head = cur;
        }
        else {
            pre->right = cur;
            cur->left = pre;
        }
        pre = cur;
        turnup(cur->right);
    }
    Node* treeToDoublyList(Node* root) {
        if (root == nullptr) {
            return root;
        }
        turnup(root);
        head->left = pre;
        pre->right = head;
        return head;
    }
};