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

  

posted @ 2019-01-28 00:18  johnny_zhao  阅读(114)  评论(0编辑  收藏  举报