二叉搜索树与双向链表

时间限制: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

posted @ 2020-03-25 12:23  牛犁heart  阅读(327)  评论(0编辑  收藏  举报