根据前序遍历和中序遍历重建二叉树

这个题目是比较有名的一道题,选择题也经常遇到,可以利用递归的方式来解决。
    /*
    struct TreeNode
    {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x),left(NULL),right(NULL){}
    TreeNode(int x,TreeNode* p1,TreeNode* p2) : val(x),left(p1),right(p2){}
    };
    */

    //vector<int> preOrder = {3,9,6,7,20,15};
    //vector<int> minOrder = {6,9,7,3,15,20};
    //OK 写对了 pre是先序遍历 mid是中序遍历
    TreeNode* rebuild(vector<int>& pre, vector<int>& mid)
    {
        if(pre.size() == 0 || mid.size() == 0) return NULL;
        TreeNode* root = new TreeNode(pre[0]);
        int k = 0;//表示mid中根节点root的位置
        for(int i=0;i<mid.size();i++)
        {
            if(mid[i] == pre[0])
            {
                k = i;
                break;
            }
        }

        //重建左子树
        vector<int> leftPre;
        leftPre.assign(pre.begin()+1,pre.begin()+1+k);
        vector<int> leftMid;
        leftMid.assign(mid.begin(),mid.begin()+k);
        root->left = rebuild(leftPre,leftMid);

        //重建右子树
        vector<int> rightPre;
        rightPre.assign(pre.begin()+k+1,pre.end());
        vector<int> rightMid;
        rightMid.assign(mid.begin()+k+1,mid.end());
        root->right = rebuild(rightPre,rightMid);

        return root;

    }
感觉像是原来的博客用指针来做的话 不用新建很多内存。
测试结果如下:

看了一个这个地址的 写的也不错,直接用interator 来做 不用新建这么多




0604 17:04新增 最直观只这样算的,但是有一个疑惑:
root->right = helper(preorder,inorder,preStart+1+midIndex  - inStart, midIndex+1,inEnd); //???为什么要加上 -inStart?????
    TreeNode* buildTreeByPreAndMid(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0 || inorder.size() == 0)
        return NULL;
        TreeNode* newTreeNode = helper(preorder,inorder,0,0,preorder.size()-1);
        return newTreeNode;
        
    }

    //preStart表示以preorder[preStart]作为根节点 inStart表示以preorder[preStart]作为根节点的子树的所有节点在inorder中的起点位置
    //inEnd表示以preorder[preStart]作为根节点的子树在inorder中的结束位置
    TreeNode* helper(vector<int>& preorder,vector<int>& inorder,int preStart,int inStart,int inEnd)
    {
        if(preorder.size() == 0 || inStart > inEnd ) return NULL;
        TreeNode* root = new TreeNode(preorder[preStart]);

        int midIndex = 0;//在inorder中找到root的值  preorder和inorder各个值并不相同
        for(int i=inStart;i<=inEnd;i++)
        {
            if(inorder[i] == preorder[preStart])
            {
                midIndex = i;
                break;
            }
        }
        root->left = helper(preorder,inorder,preStart+1,inStart,midIndex-1);
    
        root->right = helper(preorder,inorder,preStart+1+midIndex  - inStart, midIndex+1,inEnd); //???为什么要加上 -inStart?????

        return root;

    }






全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务