zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    
  • 相关阅读:
    Codeforces Round #639 Div2 A~D题解
    Codeforces Round #548 Div2 A~C题解
    Codeforces Round #581 Div2 A~D题解
    Educational Codeforces Round 69 Div2 A~D题解
    Codeforces Round #572 Div2 A~E题解
    Codeforces Round #663 Div2 A~D 题解
    44. 通配符匹配 leetcode 每日一题
    174. 地下城游戏 leetcode每日一题
    将有序数组转换为二叉搜索树 2020/7/3
    Multiplication 3 AtCoder
  • 原文地址:https://www.cnblogs.com/xym4869/p/12294217.html
Copyright © 2011-2022 走看看