二叉树根据先序遍历和中序遍历,得到后序遍历
对于二叉树的先序遍历和中序遍历,由于在先序遍历中第一个访问的总是根节点,因此可以根据先序遍历中的第一个元素,将中序遍历看成是**“左子树中序遍历+根节点+右子树中序遍历”**,根据左右子树中序遍历的节点个数,又可以将先序遍历看成是“根节点+左子树先序遍历+右子树先序遍历”。采用分治算法,postnode(str1,str2)进行分治,进行初始化这个二叉树,然后后序遍历这个二叉树。
java实现代码如下:
import java.io.*;
public class BuildTree {
/**
* 根据二叉树的前序遍历和中序遍历来找到二叉树的后序遍历
* 同时根据深度打印这个二叉树
* 2016.3.15
*/
public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String firststr=br.readLine();
String middlestr=br.readLine();
BTnode root=postnode(firststr, middlestr);
System.out.println(root.finallybianli(""));
}
public static BTnode postnode(String firststr,String middlestr){
BTnode bt=null;
// System.out.println(firststr);
// System.out.println(middlestr);
if(firststr.length()==1)
{
bt=new BTnode(firststr.charAt(0), null, null);
}
else{
//将中序遍历的字符串以根节点分成左右两部分
// String[] middle=middlestr.split(String.valueOf(firststr.charAt(0)));
// System.out.println(firststr.charAt(0));
String left_middlestr="",right_middlestr="";
String left_firststr="",right_firststr="";
char root=firststr.charAt(0);
char[] firststr_char=firststr.toCharArray();
char[] middlestr_char=middlestr.toCharArray();
int num=0;
for(int i=0;middlestr_char[i]!=root;i++)
{
left_middlestr+=middlestr_char[i];
left_firststr+=firststr_char[i+1];
num++;
}
for(int i=(++num);i<middlestr_char.length;i++)
{
right_firststr+=firststr_char[i];
right_middlestr+=middlestr_char[i];
}
if(left_firststr.length()==0)
{
bt=new BTnode(firststr.charAt(0), null, postnode(right_firststr, right_middlestr));
}
if(right_firststr.length()==0)
{
bt=new BTnode(firststr.charAt(0), postnode(left_firststr, left_middlestr), null);
}
//将前序遍历的字符串以中序遍历分成的两部分的长度分成两部分
if(left_middlestr.length()!=0&&right_middlestr.length()!=0)
{
bt=new BTnode(firststr.charAt(0), postnode(left_firststr, left_middlestr), postnode(right_firststr, right_middlestr));
}
}
return bt;
}
}
class BTnode{
private char data;
private BTnode leftnode;
private BTnode rightnode;
public BTnode(char data,BTnode leftnode,BTnode rightnode) {
this.data=data;
this.leftnode=leftnode;
this.rightnode=rightnode;
}
public char getData() {
return data;
}
public BTnode getLeftnode() {
return leftnode;
}
public BTnode getRightnode() {
return rightnode;
}
public void setData(char data) {
this.data = data;
}
public void setLeftnode(BTnode leftnode) {
this.leftnode = leftnode;
}
public void setRightnode(BTnode rightnode) {
this.rightnode = rightnode;
}
//后序遍历
public String finallybianli(String str)
{
if(leftnode!=null)
str=leftnode.finallybianli(str);
if(rightnode!=null)
str=rightnode.finallybianli(str);
//System.out.println(data);
str=str+data;
return str;
}
}