72.Construct Binary Tree from Inorder and Postorder Traversal-中序遍历和后序遍历树构造二叉树(中等题)

中序遍历和后序遍历树构造二叉树

  1. 题目

    根据中序遍历和后序遍历树构造二叉树

    注意事项
    你可以假设树中不存在相同数值的节点

  2. 样例

    给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]
    返回如下的树:
    这里写图片描述

  3. 题解

由后序遍历定义可知,后序遍历序列的最后一个元素是根节点。
由中序遍历定义可知,可以在中序遍历结果中遍历查找根节点,可将中序遍历序列分为左右子树,这样左右子树的长度也就确定了,在后序遍历序列中,可以确定左右子树的根节点,这样递归下去既可以确定整个树。

/**
 * Definition of TreeNode: public class TreeNode { public int val; public
 * TreeNode left, right; public TreeNode(int val) { this.val = val; this.left =
 * this.right = null; } }
 */

public class Solution
{
    /**
     * @param inorder
     *            : A list of integers that inorder traversal of a tree
     * @param postorder
     *            : A list of integers that postorder traversal of a tree
     * @return : Root of a tree
     */
    public TreeNode buildTree(int[] inorder, int[] postorder)
    {
        return myBuildTree(inorder, 0, inorder.length - 1, postorder, 0,
                postorder.length - 1);
    }

    private TreeNode myBuildTree(int[] inorder, int instart, int inend,
            int[] postorder, int poststart, int postend)
    {
        if (instart > inend)
        {
            return null;
        }

        TreeNode root = new TreeNode(postorder[postend]);
        int position = findPosition(inorder, instart, inend,
                postorder[postend]);

        root.left = myBuildTree(inorder, instart, position - 1, postorder,
                poststart, poststart + position - instart - 1);
        root.right = myBuildTree(inorder, position + 1, inend, postorder,
                poststart + position - instart, postend - 1);
        return root;
    }

    private int findPosition(int[] arr, int start, int end, int key)
    {
        for (int i = start; i <= end; i++)
        {
            if (arr[i] == key)
            {
                return i;
            }
        }
        return -1;
    }
}

Last Update 2016.10.2

你可能感兴趣的:(LintCode笔记)