剑指——重建二叉树

重建二叉树

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


解题思路

根据前序遍历的特点,第一个数就代表根节点。在中序遍历序列中找到根节点,那么根节点前的树就是属于左子树的,后面的就是属于右子树的。

然后根据根节点在中序遍历序列中的下标,确定左子树有多少个结点,右子树有多少个结点,依据这个从前序遍历序列中选取出左右子树中的值。

然后运用递归即可。

递归基本情况:已经涵盖在代码中了,当两个序列为空时,就到了基本情况。return null。


 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.Arrays;
11 public class Solution {
12     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
13         //递归基本条件
14         if(pre.length == 0 || in.length == 0)
15             return null;
16         //先确定根节点
17         TreeNode root = new TreeNode(pre[0]);
18         //在中序遍历序列中找到根节点
19         for(int i = 0; i < in.length; i ++){
20             if(in[i] == pre[0]){
21                 root.left = reConstructBinaryTree(
22                     Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i)
23                 );
24                 root.right = reConstructBinaryTree(
25                     Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1, in.length)
26                 );
27                 break;//加不加好像差不多,不加感觉安全一些,因为我想不清楚
28             }
29         }
30         return root;
31     }
32 }

 

猜你喜欢

转载自www.cnblogs.com/peekapoo/p/12099207.html