【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★
1.题目
2.思路
3.java代码
//测试 public class BuildTreeUsingInorderAndPreorder { public static void main(String[] args) { int[] preSort={1,2,4,7,3,5,6,8}; int[] inSort={4,7,2,1,5,3,8,6}; System.out.println(new Solution().buildTree(preSort, inSort)); } } //利用前序和中序重建二叉树 class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { //参数校验 if(preorder==null||inorder==null||preorder.length!=inorder.length||preorder.length==0) return null; return buildTreeCore(preorder,0,preorder.length-1,inorder,0,inorder.length-1); } /** * 构建二叉树,数据输入的正确性由输入数据自己保证 * * @param preorder 先序遍历的结果 * @param startPreorder 先序遍历的开始位置 * @param endPreorder 先序遍历的结束位置 * @param inorder 中序遍历的结果 * @param startInorder 中序遍历的开始位置 * @param endInorder 中序遍历的结束位置 * @return 二叉树的根结点 */ private TreeNode buildTreeCore(int[] preorder, int startPreorder, int endPreorder, int[] inorder,int startInorder, int endInorder) { // 只有一个元素时直接返回该节点,这也是递归结束的出口标志 if(startPreorder==endPreorder){ return new TreeNode(preorder[startPreorder]); }else{ // 记录根结点的在中序遍历中的位置 int rootIn=startInorder; for(int i=startInorder;i<=endInorder;i++){ if(inorder[i]==preorder[startPreorder]){ rootIn=i; break; } } // 创建根结点 TreeNode root=new TreeNode(inorder[rootIn]); // 左子树的结点个数 int leftLength=rootIn-startInorder; if(leftLength>0){ // startPreorder+1, startPreorder+leftLength:左子树在前序序列中的起始和结束位置 root.left=buildTreeCore(preorder, startPreorder+1, startPreorder+leftLength, inorder, startInorder, rootIn-1); } // 右子树的结点个数 int rightLength=endInorder-rootIn; if(rightLength>0){ // startPreorder+leftLength+1, endPreorder:左子树在前序序列中的起始和结束位置 root.right=buildTreeCore(preorder, startPreorder+leftLength+1, endPreorder, inorder, rootIn+1, endInorder); } return root; } } } //二叉树节点定义 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }