题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回后续遍历。
思路:很典型的知道前序和中序求整个二叉树的题目,首先看前序遍历,根据前序遍历的规则可以知道,第一个元素时二叉树的根节点,其他的元素则为子数的根节点。通过前序遍历的节点,在中序遍历中找到该节点,那么,这个节点的左边就是这棵树的左子树,右边是这棵树的右子树。例如:前序遍历的第一个元素为1,那么在中序遍历中找到1,那么这棵树的左子树的元素为{4,7,2},右子树的元素为{5,3,8,6},那么下面就可以递归地求解各个子树了,例如对于左子树{4,7,2},在前序遍历中按次序找到2,那么这可子树的左子树是{4,7},右子树为{},即为空。按照这种方法递归地找下去,那么就可以建立一个二叉树。下面的代码是输出后序遍历的代码,层次输出的话修改一下输出语句。
代码如下:
import java.util.*;
public class Main10
{
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};
solve(pre, in);
}
public static void solve(int []pre,int []in) //pre为前序遍历,in为中序遍历
{
if(pre.length<1) //没有元素就返回
{
return;
}
else if(pre.length==1) //只有一个元素
{
System.out.println(pre[0]); //输出这个元素
}
else
{
//在中序中找到当前根节点位置
int index = 0;
for(int i=0;i<in.length;i++)
{
if(pre[0]==in[i])
{
index = i;
}
}
//左半部分的前序
int [] leftPre = new int[index];
System.arraycopy(pre, 1, leftPre, 0, index);
//右半部分的前序
int len = pre.length-index-1;
int [] rightPre = new int[len];
System.arraycopy(pre, index+1, rightPre, 0, len);
//左边部分的中序
int [] leftIn = new int[index];
System.arraycopy(in, 0, leftIn, 0, index);
//左半部分的中序
int rlen = in.length-index-1;
int [] rightIn = new int[rlen];
System.arraycopy(in, index+1, rightIn, 0, rlen);
//递归地求解左右子树
solve(leftPre, leftIn);
solve(rightPre, rightIn);
System.out.println(pre[0]); //输出根
}
}
}
class TreeNode //树节点的类
{
int data;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(int data)
{
this.data = data;
}
}
可能还有其他比较好的方法,还望不惜吝教。
本人经验,仅供参考!