欢迎转载,请附出处:
http://blog.youkuaiyun.com/as02446418/article/details/47296821
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
代码如下:
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public class ReconstructTree {
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null||in==null){
return null;
}
TreeNode tree = reConstructCore(pre,in,0,pre.length-1,0,in.length-1);
return tree;
}
/**
*核心算法,preStart和preEnd是起始下标和结束下标
**/
public static TreeNode reConstructCore(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
TreeNode tree = new TreeNode(pre[preStart]);
tree.left = null;
tree.right= null;
if(preStart==preEnd&&inStart==inEnd){
return tree;
}
//记录中序遍历中等于前序遍历的第一位的下标
int inCenter = 0;
for(inCenter = inStart;inCenter<inEnd;inCenter++){
if(in[inCenter]==pre[preStart]){
break;
}else if (inCenter==inEnd) {
System.err.println("输入有误,请检查输入!");
}
}
//左子树的长度
int leftTreeLength = inCenter-inStart;
//右子数的长度
int rightTreeLength = inEnd-inCenter;
if(leftTreeLength>0){
//递归左子树直到左子树的末端
tree.left = reConstructCore(pre,in,preStart+1,preStart+leftTreeLength,inStart,inCenter-1);
}
if(rightTreeLength>0){
//递归右子数直到右子数的末端
tree.right = reConstructCore(pre,in,preStart+leftTreeLength+1,preEnd,inCenter+1,inEnd);
}
return tree;
}
/**
* 后序遍历
* @param node
*/
public static void traverseBinTreeRDL(TreeNode node){
if (node==null) {
return;
}
if (node.left!=null) {
traverseBinTreeRDL(node.left);
}
if(node.right!=null){
traverseBinTreeRDL(node.right);
}
System.out.println(node.val);
}
public static void main(String[] args){
//测试代码
int pre[] = {1,2,4,7,3,5,6,8};
int in[] = {4,7,2,1,5,3,8,6};
TreeNode tree = reConstructBinaryTree(pre, in);
traverseBinTreeRDL(tree);
}
}