• Lintcode---前序遍历和中序遍历树构造二叉树


    根据前序遍历和中序遍历树构造二叉树.

     注意事项

    你可以假设树中不存在相同数值的节点

    样例

    给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:

      2
     / 
    1   3


    思路:若前序遍历为空或者中序遍历为空则返回空;

             
    创建根节点,前序遍历第一个节点是个根节点,在中序遍历中找到根节点相应的位置,
    可以分别得到左子树和右子树的前序和中序遍历。重建左右子树;
             
              使用辅助空间,存放被分割开的前序和中序遍历的序列。

    /**
     * Definition of TreeNode:
     * class TreeNode {
     * public:
     *     int val;
     *     TreeNode *left, *right;
     *     TreeNode(int val) {
     *         this->val = val;
     *         this->left = this->right = NULL;
     *     }
     * }
     */
     
    
    class Solution {
        /**
         *@param preorder : A list of integers that preorder traversal of a tree
         *@param inorder : A list of integers that inorder traversal of a tree
         *@return : Root of a tree
         */
         
        /*
        思路:若前序遍历为空或者中序遍历为空则返回空;
              创建根节点,前序遍历第一个节点是个根节点,在中序遍历中找到根节点相应的位置,
              可以分别得到左子树和右子树的前序和中序遍历。重建左右子树;
              
              使用辅助空间,存放被分割开的前序和中序遍历的序列。
        */
    
    public:
        TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
            // write your code here
            
            if(preorder.size()==0||inorder.size()==0){
                return NULL;
            }
            
            if(preorder.size()!=inorder.size()){
                return NULL;
            }
            
            vector<int> preorder_l,preorder_r,inorder_l,inorder_r;
            int root_index=-1;
            int len=inorder.size();
            
            
            TreeNode* root=new TreeNode(preorder[0]);
            
            
            //  在中序队列中找出根节点位置
            for(int i=0;i<len;i++){
                if(preorder[0]==inorder[i]){
                    root_index=i;
                    break;
                }
            }
            
            //  左右子树的前序、中序队列
            for(int i=0; i<root_index; i++) {
                preorder_l.push_back(preorder[i+1]);
                inorder_l.push_back(inorder[i]);
            }
            
            for(int i=root_index+1; i<inorder.size(); i++) {
                preorder_r.push_back(preorder[i]);
                inorder_r.push_back(inorder[i]);
            }
    
            
            root->left=buildTree(preorder_l, inorder_l);
            root->right = buildTree(preorder_r, inorder_r);
            
            return root;
        }
    };
    
     
  • 相关阅读:
    DocumentHelper.parseText dom4j 前言中不允许有内容
    Spring的@Autowired 集合注入
    SpringBoot 属性注入的四种方式
    springboot bootstrap.yml和application.yml和application.properties 加载顺利
    Swagger ui登录功能实现方案
    ThreadPool ExecutorService使用invokeAll提交多个任务并等待结果返回
    Snorlax 靶场:Python 获取验证码、token 爆破
    CMS 文件管理系统:SQL Bool 盲注
    CMS 文件管理系统:SQL 时间盲注
    Snorlax 靶场:爆破攻击
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7095012.html
Copyright © 2020-2023  润新知