题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7,2,1,5,3,6,8},则重建出二叉树并输出它的头结点。
public class test2 {
public static void main(String[] args){
int[] aheadArr={1,2,4,7,3,5,6,8};
int[] centerArr={4,7,2,1,5,3,6,8};
TreeNode treeNode=reConstructBinaryTree(aheadArr, centerArr);
printBinaryTree(treeNode);
}
/**
* 定义一个二叉树的节点,节点具有的属性:left:左节点,right:右节点;val:当前值
* @author Administrator
*
*/
static class TreeNode{
int val;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(int val1){
val=val1;
}
}
/**
* 递归重建二叉树各个节点。
* 用了系统工具类Arrays。当然也可以将Arrays替换成自己写的方法。
* @param preArr
* @param centerArr
* @return
*/
public static TreeNode reConstructBinaryTree(int[] preArr,int[] centerArr){
TreeNode treeNode=null;
for(int i=0;i<centerArr.length;i++){
if(centerArr[i]==preArr[0]){
treeNode=new TreeNode(preArr[0]);
treeNode.leftNode=reConstructBinaryTree(Arrays.copyOfRange(preArr, 1, i+1), Arrays.copyOfRange(centerArr, 0, i));
treeNode.rightNode=reConstructBinaryTree(Arrays.copyOfRange(preArr, i+1, preArr.length), Arrays.copyOfRange(centerArr, i+1, centerArr.length));
}
}
return treeNode;
}
/**
* 递归打印二叉树
* @param treeNode
*/
public static void printBinaryTree(TreeNode treeNode){
if(treeNode==null){
return;
}else{
System.out.println(treeNode.val);
}
if(treeNode.leftNode!=null){
printBinaryTree(treeNode.leftNode);
}
if(treeNode.rightNode!=null){
printBinaryTree(treeNode.rightNode);
}
}
}
参考:http://blog.youkuaiyun.com/u012162920/article/details/52230517
参考:http://blog.youkuaiyun.com/jsqfengbao/article/details/47088947
本文介绍了一种根据给定的前序遍历和中序遍历序列重构二叉树的方法,并通过递归实现了这一过程。同时提供了一个打印二叉树节点值的递归函数。
1115

被折叠的 条评论
为什么被折叠?



