• 二叉搜索树与双向链表


    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 

    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    思路:
      本题解法将分两步来完成
    1. 中序遍历(LDR)对二叉搜索树进行遍历,并将整个节点存储到TreeNode*类型的vector容器中
    2. 遍历vector容器利用节点的left、right指针进行双向链表的连接
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            if(pRootOfTree == NULL)
                return NULL;
            vector<TreeNode*> treeElem;
            LRD(pRootOfTree,treeElem);
            return Tree2Link(treeElem);
        }
        void LRD(TreeNode *root,vector<TreeNode*> &saveElem)
        {
            if(root == NULL)
                return ;
            LRD(root->left,saveElem);
            saveElem.push_back(root);
            LRD(root->right,saveElem);
        }
        TreeNode *Tree2Link(vector<TreeNode*> &treeElem)
        {
            for(int i = 0;i < treeElem.size()-1;i++)
            {
                treeElem[i]->right  = treeElem[i+1];
            }
            treeElem[treeElem.size()-1]->right = NULL;
            for(int i = treeElem.size()-1;i>=0;i--)
            {
                treeElem[i]->left = treeElem[i-1];
            }
            treeElem[0]->left = NULL;
            return treeElem[0];
        }
     
    };

      当然,还存在更好的实现方法,如:Morris遍历等,可具体参考牛客网本题的讨论https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

  • 相关阅读:
    Hitachi Programming Contest 2020 E Odd Sum Rectangle
    CF1060F Shrinking Tree
    UR #19
    AGC041F Histogram Rooks
    JOISC2020 Legendary Dango Maker
    Dinic 二分图匹配 / Hopcroft-Karp 算法 复杂度简单证明
    Codechef March Challenge 2020 Division 1 BREAK
    Tomorrow will be fine.
    JOISC2019 穿越时空 Bitaro
    POI2011 Periodicity
  • 原文地址:https://www.cnblogs.com/whiteBear/p/12565272.html
Copyright © 2020-2023  润新知