zoukankan      html  css  js  c++  java
  • 重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    解决这道题的关键在于,前序遍历的顺序是先根再左子树再右子树,因此前序遍历序列的第一个节点是根节点。找到根节点后,再在中序遍历序列中找到根节点所在的位置,中序遍历的顺序是先左子树,再根,再右子树。因此中序遍历中根前面的一段为左子树,根后面的一段为右子树。左右子树的长度就知道了。然后再递归的求左右子树。

    为了方便调用变量,可以使用全局变量。中序遍历中每个节点的下标可以用哈希表来存,同样也是方便之后调用。dfs递归函数中的四个参数分别代表前序遍历的左端点和右端点、中序遍历的左端点和右端点。

    c++代码如下:

     1 class Solution {
     2 public:
     3     vector<int> preorder, inorder;
     4     map<int, int> hash;
     5     
     6     TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
     7         preorder = pre, inorder = vin;
     8         for(int i = 0; i < inorder.size(); i++) hash[inorder[i]] = i;
     9         return dfs(0, preorder.size() - 1, 0, inorder.size() - 1);
    10     }
    11     
    12     TreeNode* dfs(int pl, int pr, int il, int ir){
    13         if(pl > pr) return nullptr;
    14         TreeNode* root = new TreeNode(preorder[pl]);
    15         int k = hash[root->val];
    16         root->left = dfs(pl + 1, pl + k - il, il, k - 1);
    17         root->right = dfs(pl + k - il + 1, pr, k + 1, ir);
    18         return root;
    19     }
    20 };
  • 相关阅读:
    Eclipse插件安装方法大全
    Weblogic web应用中获取文件的绝对路径
    Weblogic 设置优先引用web项目的jar包
    Oracle 数据库创建(图形界面操作)
    Java 输入输出流总结
    如何获取项目中文件的路径
    EclEmma安装与使用
    单向链表

    散列表
  • 原文地址:https://www.cnblogs.com/hellosnow/p/11720821.html
Copyright © 2011-2022 走看看