将二叉搜索树转为有序双向链表,因为二叉树的中序遍历恰好有序!所以按照中序遍历的递归思路构造有序双向链表。
一个节点的左节点是左子树中序遍历最后的节点,与当前节点在二叉树中存在层次距离,所以想在二叉树的层次结构上得到左边节点在操作上复杂度很高,而中序遍历已经确保了这种有序关系,所以尝试保留中序遍历的前一个节点 pre.这时我们可以在遍历完左子树时,将 pre->rightrt->left 完成。那 rt->right 什么时候补上呢? 得到 rt 成为某个节点的 pre 时,即在搜索 rt 的右子树前,更新 prert. done.

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
    TreeNode *pre = nullptr, *head = nullptr;
public:
    TreeNode* Convert(TreeNode* rt)
    {
        cvt(rt);
        return head;
    }
    void cvt(TreeNode* rt) 
    {
        if (!rt) return ;
        cvt(rt->left);
        if (!head) {
            head = rt;
        } else {
            rt->left = pre;
            pre->right = rt;
        }
        pre = rt;
        cvt(rt->right);
    }
};