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

    题意:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
    常规的用递归方法,二叉树的遍历序列通过vector存出,这时候可以用map建立一个哈希表,方便找到根节点在中序遍历的位置从而分开左右子树。
    求出左子树和右子树在序列中的区间范围,不断递归。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    
        vector<int> preorder,inorder;
         map<int,int>hash;
        TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
            preorder=_preorder,inorder=_inorder;
           
            for(int i=0;i<inorder.size();i++) hash[inorder[i]]=i;
            return dfs(0,preorder.size()-1,0,inorder.size()-1);
        }
        
        TreeNode* dfs(int pl,int pr,int il,int ir)
        {
            if(pl>pr) return nullptr;
            auto root=new TreeNode(preorder[pl]);
            int k=hash[root->val];
            auto left=dfs(pl+1,pl+k-il,il,k-1);
            auto right=dfs(pl+k-il+1,pr,k+1,ir);
            
           root->left=left,root->right=right;
            
            return root;
        }
    };
    
  • 相关阅读:
    关于java和jvm的思考
    java之try、catch、finally
    Microsoft SQLServer有四种系统数据库
    HDU 5087
    uva639 暴力、回溯
    uva127
    uva 131
    洛谷 P2580 于是他错误的点名开始了
    字典树(trie)
    HTML学习笔记
  • 原文地址:https://www.cnblogs.com/daoyuan/p/13472967.html
Copyright © 2011-2022 走看看