/**
* 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;
}
}