105. Construct Binary Tree from Preorder and Inorder Traversal
/**
* 105. Construct Binary Tree from Preorder and Inorder Traversal
*
* https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/
*
* Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
* */
class Solution { class TreeNode(var `val`: Int = 0) { var left: TreeNode? = null; var right: TreeNode? = null; } fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? { if (preorder.isEmpty() || inorder.isEmpty()) return null; val map = HashMap<Int, Int>(); for ((index, element) in inorder.withIndex()) { map.put(element, index); } return help(preorder, 0, preorder.size - 1, inorder, 0, inorder.size - 1, map); } fun help( preorder: IntArray, pLeft: Int, pRight: Int, inorder: IntArray, iLeft: Int, iRight: Int, map: HashMap<Int, Int> ): TreeNode? { if (pLeft > pRight || iLeft > iRight) return null; val node = TreeNode(preorder[pLeft]); val rootIndex:Int = map.get(preorder[pLeft])!!;//not-null assertion operator:!! convert Int? to Int node.left = help(preorder, pLeft+1, pLeft+rootIndex-iLeft,inorder,iLeft,rootIndex-1,map); node.right = help(preorder, pLeft+rootIndex-iLeft+1,pRight,inorder,rootIndex+1,iRight,map); return node; } }