(四)需要好好理解

  题目表述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

   解题思路: 前序:根结点-左孩子-右孩子  中序:左孩子-根结点-右孩子  后序:左孩子-右孩子-根节点。每次遇到一个根节点都要重新递归,从开始的根节点开始去遍历。

        

 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 public class Solution {
11     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
12         TreeNode root = new TreeNode(pre[0]);//前序的第一个数字为根
13         int len = pre.length;
14         //当只有一个数的时候
15         if(len==1){
16             root.left=null;
17             root.right=null;
18             return root;
19         }
20         //找到中序中的根位置
21         int rootval=root.val;
22         int i;
23         for(i=0;i<len;i++){
24             if(rootval==in[i])
25                 break;
26         }
27         //创建左子树
28         if(i>0){
29             int[] pr = new int[i];
30             int[] ino = new int[i];
31             for(int j=0;j<i;j++){
32                 pr[j]=pre[j+1];
33             }
34             for(int j=0;j<i;j++){
35                 ino[j]=in[j];
36             }
37             root.left=reConstructBinaryTree(pr,ino);
38         }else{
39             root.left = null;
40         }
41         
42         //创建右子树
43         if(len-i-1>0){
44             int[] pr = new int[len-i-1];
45             int[] ino = new int[len-i-1];
46             for(int j=i+1;j<len;j++){
47                 ino[j-i-1]=in[j];
48                 pr[j-i-1]=pre[j];
49             }
50             root.right = reConstructBinaryTree(pr,ino);
51         }else{
52             root.right=null;
53         }
54         return root;
55     
56     }
57 }

 

posted @ 2018-12-06 20:04  落水河图  阅读(93)  评论(0)    收藏  举报