重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 
 
根据前序和中序确定二叉树,根据它们的特性,可知前序第一个元素是根节点,和中序对应找出各自的左子树和右子树。
然后递归循环,在找相同的元素,此为子树的根节点,然后继续操作,直到子树为空。
 
  Arrays.copyOfRange(byte[] original, int from, int to)是对数组的指定位置的复制。
 
下面是实现的代码:
 
 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 import java.util.*;
11 
12 public class Solution {
13     public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
14         if (pre == null || in == null || pre.length == 0 || in.length == 0) {
15             return null;
16         }
17         TreeNode root = construct(pre, in);
18         return root;
19     }
20 
21     private TreeNode construct(int[] pre, int[] in) {
22         int length = pre.length;
23         if (length == 0)
24             return null;
25         TreeNode root = new TreeNode(pre[0]);
26         int i = 0;
27         for (; i < length; i++) {
28             if (in[i] == pre[0])
29                 break;
30         }
31         if (i == length)
32             i--;
33         int[] leftPre = Arrays.copyOfRange(pre, 1, i + 1);
34         int[] rightPre = Arrays.copyOfRange(pre, i + 1, length);
35         int[] leftIn = Arrays.copyOfRange(in, 0, i);
36         int[] rightIn = Arrays.copyOfRange(in, i + 1, length);
37         root.left = construct(leftPre, leftIn);
38         root.right = construct(rightPre, rightIn);
39         return root;
40     }
41 }

 

posted @ 2016-08-03 21:14  华不摇曳  阅读(228)  评论(0编辑  收藏  举报