剑指offer系列——26.二叉搜索树与双向链表??

Posted xym4869

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer系列——26.二叉搜索树与双向链表??相关的知识,希望对你有一定的参考价值。

Q:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
T:利用一个栈实现二叉树的中序遍历,题中说这是一颗二叉树,那么二叉树的中序遍历是一个有顺序的,? 那么这个时候只需要在中序遍历的时候当找到一个遍历节点的时候先将这个节点保存起来,然后遍历下一个节点的时候将之前保存的节点的right域指向下一个结点,下一个结点的left域指向上一个结点。这样一来就形成了一个排序的双向链表。然后将之前指向保存的指针指向当前这个结点。

//递归版
private:
    TreeNode* pLast = nullptr;
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(!pRootOfTree)
            return nullptr;
        TreeNode* head = Convert(pRootOfTree->left);
        if(!head)
            head = pRootOfTree;
        pRootOfTree->left = pLast;
        if(pLast)
           pLast->right = pRootOfTree;
        pLast = pRootOfTree;
        Convert(pRootOfTree->right);
        return head;
    }

//非递归版
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode *head = NULL, *pre = NULL;//head 输出,pre记录上一次出栈值
        stack<TreeNode*> s;
        while (pRootOfTree || !s.empty())
        {
            while (pRootOfTree)
            {
                s.push(pRootOfTree);
                pRootOfTree = pRootOfTree->left;
            }
            if (!s.empty())
            {
                pRootOfTree = s.top();
                s.pop();
                if (pre != NULL)
                {
                    pre->right = pRootOfTree;
                    pRootOfTree->left = pre;
                }
                else//pre为空,表示s第一次出栈,第一次出栈值为最左值,即输出值
                    {
                    head = pRootOfTree;
                }
                pre = pRootOfTree;
                pRootOfTree = pRootOfTree->right;
            }
        }
        return head;
    }

P.S.对不起我还是没懂这个题……

以上是关于剑指offer系列——26.二叉搜索树与双向链表??的主要内容,如果未能解决你的问题,请参考以下文章

26剑指offer--二叉搜索树与双向链表

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

剑指offer---二叉搜索树与双向链表

剑指offer 27二叉搜索树与双向链表

Java 剑指offer(36) 二叉搜索树与双向链表

剑指offer python版 二叉搜索树与双向链表