重建二叉树的方法有很多种,但是并不是通过任意两种深度优先遍历方式都可以重建二叉树,它也是有限制的。
通过前序+中序、后序+中序、层序+中序这三种方式是可以重建二叉树的,但是通过前序+后序、前序+层序、后序+层序这三种方式是不能重建二叉树的。本文重点讲解通过前序+中序的方式重建二叉树的基本思想以及具体的代码实现。
基本思想
中序遍历的第一个节点是root节点,在前序遍历中找到root, root的前半段就是root的左子树的前序遍历(长度M), root的后半段就是root的右子树的前序遍历(长度N),因此在前序遍历种,root之后长度M的序列是root的左子树的中序遍历,再后面N个就是root右子树的中序遍历,重复上述过程即可。
代码实现
1 /** 2 * 二叉树节点的定义 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class reConstruct{ 11 public TreeNode reConstructBinaryTree(int [] pre, int [] in){ 12 TreeNode treeNode = reConstruct(pre,0,pre.length-1,in,0,in.length-1); 13 return treeNode; 14 } 15 16 private TreeNode reConstruct(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){ 17 if(startPre>endPre || startIn>endIn){ 18 return null; 19 } 20 TreeNode treeNode = new TreeNode(pre[startPre]); 21 for(int i=startIn;i<=endIn;i++){ 22 if(in[i]==pre[startPre]){ 23 treeNode.left = reConstruct(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); 24 treeNode.right = reConstruct(pre,startPre+i-startIn+1,endPre,in,i+1,endIn); 25 break; 26 } 27 } 28 return treeNode; 29 } 30 }
原文地址:https://www.cnblogs.com/Demrystv/p/9058536.html
时间: 2024-09-29 21:18:58