zoukankan      html  css  js  c++  java
  • [LeetCode-21]Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree.

    Note:
    You may assume that duplicates do not exist in the tree.

    There is an example.
            _______7______
           /              
        __10__          ___2
       /              /
       4       3      _8
                    /
                 1  11
    The preorder and inorder traversals for the binary tree above is:
    preorder = {7,10,4,3,1,2,8,11}
    inorder = {4,10,3,1,7,11,8,2}

    The first node in preorder alwasy the root of the tree. We can break the tree like:
    1st round:
    preorder:  {7}, {10,4,3,1}, {2,8,11}
    inorder:     {4,10,3,1}, {7}, {11, 8,2}

            _______7______
           /              
        {4,10,3,1}       {11,8,2}
    Since we alreay find that {7} will be the root, and in "inorder" sert, all the data in the left of {7} will construct the left sub-tree. And the right part will construct a right sub-tree. We can the left and right part agin based on the preorder.
    2nd round
    left part                                                                            right part
    preorder: {10}, {4}, {3,1}                                              {2}, {8,11}
    inorder:  {4}, {10}, {3,1}                                                {11,8}, {2}


            _______7______
           /              
        __10__          ___2
       /              /
       4      {3,1}   {11,8}
    see that, {10} will be the root of left-sub-tree and {2} will be the root of right-sub-tree.

    Same way to split {3,1} and {11,8}, yo will get the complete tree now.

            _______7______
           /              
        __10__          ___2
       /              /
       4       3      _8
                    /
                 1  11
    So, simulate this process from bottom to top with recursion as following code.
    c++

    TreeNode *BuildTreePI(
        vector<int> &preorder,
        vector<int> &inorder,
        int p_s, int p_e,
        int i_s, int i_e){
        if(p_s > p_e) return NULL;
        int pivot = preorder[p_s];
        int i = i_s;
        for(;i<i_e;i++){
            if(inorder[i] == pivot)
                break;
        }
        int length1 = i-i_s-1;
        int length2 = i_e-i-1;
        TreeNode* node = new TreeNode(pivot);
        node->left = BuildTreePI(preorder,inorder,p_s+1,length1+p_s+1,i_s, i-1);
        node->right = BuildTreePI(preorder, inorder, p_e-length2, p_e, i+1, i_e);
        return node;
    }
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        return BuildTreePI(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }

    java

    public TreeNode buildTree(int[] preorder, int[] inorder) {
            return buildPI(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
        }
    	public TreeNode buildPI(int[] preorder, int[] inorder, int p_s, int p_e, int i_s, int i_e){
    		if(p_s>p_e)
    			return null;
    		int pivot = preorder[p_s];
    		int i = i_s;
    		for(;i<i_e;i++){
    			if(inorder[i]==pivot)
    				break;
    		}
    		TreeNode node = new TreeNode(pivot);
    		int lenLeft = i-i_s;
    		node.left = buildPI(preorder, inorder, p_s+1, p_s+lenLeft, i_s, i-1);
    		node.right = buildPI(preorder, inorder, p_s+lenLeft+1, p_e, i+1, i_e);
    		return node;
    	}


查看全文
  • 相关阅读:
    css3很美的蟠桃动画
    EXCEL countif函数多条件
    R语言介绍
    【转】Docker:Docker Compose 详解
    【转】Linux基础命令-curl
    【转】进入正在运行的Docker容器的4种方式
    【转】yum和apt-get的区别
    【转】laravel框架中 session保存到Redis中
    【转】Laravel 控制器 Controller 传值到 视图 View 的几种方法总结
    【转】Laravel中使用门面模式(Facade)
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10668599.html
  • Copyright © 2011-2022 走看看