面试题7:重建二叉树


题意:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

算法:递归

思路:1)利用前序遍历找根节点,即前序遍历的第一个值就是根节点的值
2)利用中序遍历找左右子树,通过前序遍历的第一个值找到中序遍历该值的下标,其左边为左子树,右边为右子树
3)通过中序遍历划分出来的左右子树个数找前序遍历的左右子树,假设中序遍历的找到的左子树个数为l,则前序
遍历根节点后面l个数时左子树,其余后面的数为右子树
4)递归构造左右子树

时间复杂度:O(n)

unordered_map<int, int> hash;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    int n = preorder.size();
    // 将中序遍历每个数对应的下标存入哈希表,方便从根节点的值找到中序下标
    for(int i = 0;i < n;i ++) hash[inorder[i]] = i;
    return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
    
}

TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir)
{
    if(pl > pr) return NULL;
    int val = preorder[pl];
    int k = hash[val];
    int len = k - il;
    auto root = new TreeNode(val);
    root -> left = dfs(preorder, inorder, pl + 1, pl + len, il, k - 1);
    root -> right = dfs(preorder, inorder, pl + len + 1, pr, k + 1, ir);
    return root;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复...
    凌霄文强阅读 200评论 0 2
  • 【题目描述】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重...
    fighting_css阅读 162评论 0 0
  • 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重...
    小歪与大白兔阅读 165评论 0 0
  • 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 ...
    繁星追逐阅读 65评论 0 0
  • 文/米兰 我们都喜欢讲自律这个词,似乎这已经成为了我们这些平凡人的唯一出路了。记得前阵子清华毕业生张薇的演讲,一下...
    米兰S阅读 397评论 1 1