ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

刷题105. Construct Binary Tree from Preorder and Inorder Traversal

2020-03-05 20:01:04  阅读:202  来源: 互联网

标签:Binary TreeNode createTree Preorder preorder int Tree leftStart inorder


一、题目说明

题目105. Construct Binary Tree from Preorder and Inorder Traversal,给二叉树的前序和中序遍历序列,构造一棵二叉树。题目难度是Medium!

二、我的解答

这个题目数据结构上面也有讲,这里用递归遍历算法。前序遍历第1个为树的根,然后用根将中序遍历分成左右子树,再递归就可以了。

代码如下:

class Solution{
    public:
        TreeNode* createTree(vector<int> & preorder,vector<int>& inorder,int leftStart,int leftEnd){
            //preorder中当前元素为树根
            TreeNode* r = new TreeNode(preorder[curRoot]);
            
            int k=leftStart;
            while(inorder[k] !=preorder[curRoot]) k++;
            
            curRoot++;
            if(k>leftStart){
                r->left = createTree(preorder,inorder,leftStart,k-1);
            }
            if(k<leftEnd){
                r->right = createTree(preorder,inorder,k+1,leftEnd);
            }
            return r;
        }
        TreeNode* buildTree(vector<int>& preorder,vector<int>& inorder){
            int len = preorder.size();
            if(preorder.size()<1) return NULL;
            TreeNode* root = new TreeNode(preorder[0]);
            if(len==1) return root;
            
            int k=0;
            while(inorder[k] !=preorder[0]) k++;
            curRoot = 1;
            if(k>0){
                root->left = createTree(preorder,inorder,0,k-1);
            }
            if(k<len-1){
                root->right = createTree(preorder,inorder,k+1,len-1);
            }
            
            return root;
        }
    private:
        int curRoot;
};

性能如下:

Runtime: 24 ms, faster than 44.15% of C++ online submissions for Construct Binary Tree from Preorder and Inorder Traversal.
Memory Usage: 22.2 MB, less than 9.52% of C++ online submissions for Construct Binary Tree from Preorder and Inorder Traversal.

三、优化措施

代码简化如下:

class Solution{
    public:
        TreeNode* createTree(vector<int> & preorder,vector<int>& inorder,int leftStart,int leftEnd){
            TreeNode* r = new TreeNode(preorder[curRoot]);
            
            int k=leftStart;
            while(inorder[k] !=preorder[curRoot]) k++;
            
            curRoot++;
            if(k>leftStart){
                r->left = createTree(preorder,inorder,leftStart,k-1);
            }
            if(k<leftEnd){
                r->right = createTree(preorder,inorder,k+1,leftEnd);
            }
            return r;
        }
        TreeNode* buildTree(vector<int>& preorder,vector<int>& inorder){
            int len = preorder.size();
            if(len<1) return NULL;
            curRoot = 0;
            return createTree(preorder,inorder,0,len-1);
        }
    private:
        int curRoot;
};
Runtime: 20 ms, faster than 64.01% of C++ online submissions for Construct Binary Tree from Preorder and Inorder Traversal.
Memory Usage: 22.4 MB, less than 9.52% of C++ online submissions for Construct Binary Tree from Preorder and Inorder Traversal.

标签:Binary,TreeNode,createTree,Preorder,preorder,int,Tree,leftStart,inorder
来源: https://www.cnblogs.com/siweihz/p/12267595.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有