zoukankan      html  css  js  c++  java
  • 106. Construct Binary Tree from Inorder and Postorder Traversal

    package LeetCode_106
    /**
     * 106. Construct Binary Tree from Inorder and Postorder Traversal
     * https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/
     *
     * Given inorder and postorder traversal of a tree, construct the binary tree.
    Note:
    You may assume that duplicates do not exist in the tree.
    
    For example, given
    inorder = [9,3,15,20,7]
    postorder = [9,15,7,20,3]
    Return the following binary tree:
       3
      / 
     9  20
       /  
      15   7
     * */
    class TreeNode(val `val`: Int) {
        var left: TreeNode? = null
        var right: TreeNode? = null
    }
    
    class Solution {
        /*
        Time complexity:O(n^2), Space complexity:O(n)
        * we know that:
        * inorder: left->root->right
        * postorder: left->right->root
        * so the root of the tree is 3,
        * and we will divide the inorder array based in the last element of the postorder that two part will be left and right
        * */
        var rootIndex = 0
    
        fun buildTree(inorder: IntArray, postorder: IntArray): TreeNode? {
            rootIndex = postorder.size-1
            return buildTree(inorder,0,inorder.size-1,postorder)
        }
    
        private fun buildTree(inorder: IntArray,start:Int, end:Int, postorder: IntArray):TreeNode?{
            if (start>end){
                return null
            }
            if (start==end){
                return TreeNode(postorder[rootIndex--])
            }
            val root = TreeNode(postorder[rootIndex--])
            for (i in start..end){
                //if we find out the position of the root, create left and right
                if (inorder[i]==root.`val`) {
                    //if is preorder array, we build left node first
                    //if is postorder array, we build right node first
                    root.right = buildTree(inorder, i + 1, end, postorder)
                    root.left = buildTree(inorder, start, i - 1, postorder)
                    return root
                }
            }
            return root
        }
    }
  • 相关阅读:
    深入理解并发编程 -- 多线程(一)
    使用Mybatis实现动态SQL(二)
    Java设计模式
    使用Mybatis实现动态SQL(一)
    Java
    Java安全(权限)框架
    List-LinkedList、set集合基础增强底层源码分析
    hadoop3.1.0 window win7 基础环境搭建
    springmvc传递有特殊字符的路径参数
    jhipster(springboot+datatable+jpa)后台分页,总结
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13258223.html
Copyright © 2011-2022 走看看