Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:mac顶部菜单栏隐藏 编辑:程序博客网 时间:2024/06/06 00:20

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

Have you been asked this question in an interview? 

/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public TreeNode buildTree(int[] preorder, int[] inorder) {        if (preorder == null || inorder == null || preorder.length != inorder.length || preorder.length == 0) {            return null;        }        return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);    }    private TreeNode buildTree(int[] preorder,int pStart, int pEnd, int[] inorder,int iStart, int iEnd) {        if (iStart > iEnd) {            return null;        }        TreeNode head = new TreeNode(preorder[pStart]);        if (pStart == pEnd) {            return head;        }        int count = 0;        while ((count + iStart) <= iEnd){            if(inorder[count + iStart] == preorder[pStart]) {                break;            }            count++;        }        head.left = buildTree(preorder, pStart + 1, pStart + count, inorder, iStart, iStart + count - 1);        head.right = buildTree(preorder, pStart + count + 1, pEnd, inorder, count + iStart + 1, iEnd);        return head;    }}

这道题目最重要的是理解如何通过 preorder 和inorder 可以构造出tree:
即 根据preorder 的第一个节点能知道 root, 然后在inorder 中找root 的位置,这个位置的左侧构成左子树,右侧构成右子树
同时要注意在递归时要小心 position 的表示,容易出错

0 0