zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
     
  • 相关阅读:
    基于bootstrap的上传插件fileinput实现ajax异步上传功能(支持多文件上传预览拖拽)
    BootStrap fileinput.js文件上传组件实例代码
    Bootstrap fileinput.js,最好用的文件上传组件
    JS组件系列——Bootstrap文件上传组件:bootstrap fileinput
    JS文件上传神器bootstrap fileinput详解
    ***文件上传控件bootstrap-fileinput的使用和参数配置说明
    很清晰的解读i2c协议【转】
    高并发的socket的高性能设计【转】
    android dm-verity 功能【转】
    ARM的Jazelle技术【转】
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/7095012.html
Copyright © 2011-2022 走看看