二叉搜索树与双向链表

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

【思路】注意此题目是将一个二叉搜索树转换成排序的双向链表,如果没有其他要求,我们可以直接对这个二叉树进行中序遍历,就可以得到已经排序好的节点,然后组合成一个双向链表,但题目不允许转换成新的节点!

尽管如此,仍然可以使用中序遍历的思路,这时我们需要使用一个指针保存前驱节点pre,首先将pre指向当前节点的left,若pre不为空,则修改pre的right指向当前节点,接着让前驱节点向后移动,也就是指向当前节点cur。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    void process(TreeNode* cur, TreeNode*& pre){
        if(cur == nullptr) return;
        process(cur->left, pre);

        cur->left = pre;
        if(pre) pre->right = cur;  
        // 如果前驱节点不为空,则将前驱节点的右节点指向当前节点
        pre = cur;

        process(cur->right, pre);
    }

    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr) return nullptr;
        TreeNode* pre = nullptr;  // 声明指针要进行初始化

        process(pRootOfTree, pre);

        TreeNode* res = pRootOfTree;
        while(res->left){
            res = res->left;
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/zhudingtop/p/11346306.html