PAT-1086(Tree Traversals Again)Java语言实现+根据中序和前序遍历构建树并且给出后序遍历序列
Tree Traversals Again
Tree Traversals Again
- 这里的第一个tip就是注意到非递归中序遍历的过程中,进栈的顺序恰好是前序遍历的顺序,而出栈的顺序恰好是中序遍历的顺序。
- 第二个需要注意的就是如何根据中序遍历和前序遍历构建出一棵二叉树。
- 第三个是二叉树的后序遍历,这里我采用的是后序遍历的方法
import java.util.Scanner;
import java.util.Stack;
/**
* @Author WaleGarrett
* @Date 2020/9/5 12:02
*/
/**
* 根据前序遍历和中序遍历来构建一棵树
* 进栈的顺序对应前序遍历的顺序,出栈的顺序对应中序遍历的顺序
*/
public class PAT_1086 {
static int[] preorder;
static int[] inorder;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Stack<Integer>sta=new Stack<>();
int n=scanner.nextInt();
scanner.nextLine();//读取上一行的换行符
preorder=new int[n];
inorder=new int[n];
int precnt=0,incnt=0;
n*=2;
while(n!=0){
String s=scanner.nextLine();
// System.out.println(s);
if(s.length()>4){//push操作
String values=s.substring(5);
int value=Integer.parseInt(values);
sta.push(value);
preorder[precnt++]=value;
}else{//pop操作
int value=sta.peek();
sta.pop();
inorder[incnt++]=value;
}
n--;
}
TreeNode root=createTree(0,precnt-1,0,incnt-1);//根据前序遍历序列和中序遍历序列构建二叉树
System.out.println(postOrder(root," ").trim());
}
public static TreeNode createTree(int prel,int prer,int inl,int inr){
if(prel>prer)//叶子结点
return null;
TreeNode root=new TreeNode();
root.value=preorder[prel];
int position=0;
for(int i=inl;i<=inr;i++){
if(preorder[prel]==inorder[i]){
position=i;
break;
}
}
int inlcnt=position-inl;
root.left=createTree(prel+1,prel+inlcnt,inl,position-1);
root.right=createTree(prel+inlcnt+1,prer,position+1,inr);
return root;
}
public static String postOrder(TreeNode root,String result){
if(root.left!=null)
result=postOrder(root.left,result);
if(root.right!=null)
result=postOrder(root.right,result);
result=result+root.value+" ";
return result;
}
}
class TreeNode{
TreeNode left;
TreeNode right;
int value;
public TreeNode(){
left=right=null;
value=-1;
}
public TreeNode(int value){
this.value=value;
left=right=null;
}
}
Either Excellent or Rusty