public class TreeTest {
/*
* 题目描述
* 输入某二叉树的前序遍历和中序遍历的结果,
* 请重建出该二叉树。
* 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
* 例如输入前序遍历序列{1,2,4,7,3,5,6,8}
* 和中序遍历序列{4,7,2,1,5,3,8,6},
* 则重建二叉树并返回。
* */
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
/**
*
* @param pre 前序序列
* @param in 中序序列
* @return
*
*/
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length!=in.length||pre.length==0||in.length==0){
System.out.println("输入为不合法的树");
return null;
}
return binaryTreeCore(pre,0, pre.length-1,in,0,in.length-1);
}
public TreeNode binaryTreeCore(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd){
//创建树并设置根节点
TreeNode treeNode = new TreeNode(pre[preStart]);
treeNode.left = treeNode.right = null;
//只有一个节点
if(preStart==preEnd){
if(inStart==inEnd&&in[inStart]==in[inEnd]){
return treeNode;
}
}
//中序根节点
int rootInorder =inStart;
//找到中序中的根节点
while(rootInorder<inEnd&&in[rootInorder]!=treeNode.val){
++rootInorder;
}
//中序序列寻找完毕都没有找到根节点
if(rootInorder==inEnd&&in[rootInorder]!=treeNode.val){
System.out.println("树结构非法");
return null;
}
//左子树长度
int leftLength = rootInorder-inStart;
//左子树前序结尾=前序开始+左子树长度
int leftPreorderEnd =preStart+leftLength;
//存在左子树
if(leftLength>0){
//左子树
treeNode.left = binaryTreeCore(pre,preStart+1,leftPreorderEnd, in, inStart,rootInorder-1);
}
//存在右子树
if(leftLength<preEnd-preStart){
//右子树
treeNode.right = binaryTreeCore(pre, leftPreorderEnd+1,preEnd, in, rootInorder+1, inEnd);
}
return treeNode;
}
public static void main(String[] args) {
TreeTest test = new TreeTest();
int[] pre ={1,2,4,7,3,5,6,8};
int[] in ={4,7,2,1,5,3,8,6};
test.reConstructBinaryTree(pre, in);
}
}
重建二叉树java
最新推荐文章于 2023-05-29 21:27:37 发布