首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >该算法是否适用于BTree构造,时间复杂度为O(n)?

该算法是否适用于BTree构造,时间复杂度为O(n)?
EN

Stack Overflow用户
提问于 2020-09-24 02:06:08
回答 1查看 41关注 0票数 0

给定树的前序和中序遍历,构造二叉树。

注意:您可以假设树中不存在重复项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            
            if (preorder.empty()) return nullptr;
            

            TreeNode* root;
            
            //inorder val , index
            unordered_map<int, int> inOrderMap;
            unordered_map<int, int> preOrderMap;
            for (int i = 0; i < inorder.size(); i++) {
                preOrderMap.insert({preorder.at(i), i});
                inOrderMap.insert({inorder.at(i), i});
            }
            
            root = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, 0, inorder.size() - 1);
            
            return root;
        }
    
    private: 
        TreeNode* recursiveHelper(const vector<int>& preorder, 
                                  const unordered_map<int, int>& preOrderMap,
                                  const vector<int>& inorder, 
                                  const unordered_map<int, int>& inOrderMap, int i1, int j1) {
            
            
            if (i1 > j1) return nullptr;
            
            //minPre should be the first index in preorder where a value of inorder from i1->j1 appears
            //minIN should be the index of the inorder number that first appears in preorder
            int minPre = INT_MAX;
            int minIn;
            int corresp;
            for (int i = i1; i <= j1; i++) {
                corresp = preOrderMap.at( inorder.at(i) );
                if (corresp < minPre) {
                    minPre = corresp;
                    minIn = i;
                }
            }
            
            TreeNode* root = new TreeNode( preorder.at(minPre) );
            
            root->left = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, i1, minIn - 1);
            root->right = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, minIn + 1, j1);
            
            return root;
        }
};

for循环让我认为它是O(n),但与其他O(n)算法相比,该算法以毫秒为单位所需的时间要多得多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-24 02:12:21

在给定的代码中,不仅有for循环,还有递归,这可能会使您的代码成为O(n * log )。如果你想严格证明算法的复杂性,Master theorem会很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64038549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文