重建二叉树

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

解该题目之前,我先来复习一下二叉树的遍历:

详见维基百科

深度优先遍历 - 前序遍历

深度优先遍历 - 中序遍历

 深度优先搜索 - 后序遍历

广度优先遍历 - 层次遍历

  

 F, B, A, D, C, E, G, I, H.  A, B, C, D, E, F, G, H, I.  A, C, E, D, B, H, I, G, F. F, B, G, A, D, I, C, E, H.

首先是Java中的Arrays.copyOfRange()方法,该方法首先要import java.util.*;

Arrays.copyOfRange(T[] original, int from,int to)

即将一个原始的数组original,从小标from开始复制,复制到小标to,生成一个新的数组。

这里数组包括from,但是不包括to。java和C下标从0开始。

 1 import java.util.*;
 2 /**
 3  * Definition for binary tree
 4  * public class TreeNode {
 5  *     int val;
 6  *     TreeNode left;
 7  *     TreeNode right;
 8  *     TreeNode(int x) { val = x; }
 9  * }
10  */
11 public class Solution {
12     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
13         if ((pre.length ==0)||(in.length == 0)){
14             return null;
15         }
16         TreeNode node = new TreeNode(pre[0]);
17         for (int i = 0; i<in.length; i++){
18             if (pre[0] == in[i]){
19                 node.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
20                 node.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
21             }
22         }
23         return node;
24     }
25 }

采用类似于递归的方法进行树的重建,即利用了数遍历的规律。

待细细琢磨。

原文地址:https://www.cnblogs.com/10081-AA/p/10533603.html