首页 > 试题广场 >

二叉树遍历

[编程题]二叉树遍历
  • 热度指数:20585 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

输入描述:
两个字符串,其长度n均小于等于26。
第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。


输出描述:
输入样例可能有多组,对于每组测试样例,
输出一行,为后序遍历的字符串。
示例1

输入

ABC
BAC
FDXEAG
XDEFAG

输出

BCA
XEDGAF
第一次提交的时候很复杂,后来参考大神们的c++代码精简了下
import java.util.*;
public class Main{
      public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            judge(sc.nextLine(), sc.nextLine());
        }
    }
    public static void judge(String str1,String str2){
        if (str1.length() == 0) return;
        int num = str2.indexOf(str1.charAt(0));
        judge(str1.substring(1, num + 1), str2.substring(0, num));
        judge(str1.substring(num + 1), str2.substring(num + 1));
        System.out.print(str1.charAt(0));
    }
}

发表于 2022-02-28 01:38:30 回复(0)
import java.util.Scanner;
public class Main{
    /*
    思路:递归
    一颗树的左子树的后序遍历+右子树的后序遍历+该树根节点的值为该树的后序遍历序列
    */
    private static int count = 0;//记录当前选择的是前序遍历序列中的第几个节点
    public static void main(String[] args){
        try(Scanner in = new Scanner(System.in)){
            String s1 = in.nextLine(),s2 = in.nextLine();
            char[] a = s1.toCharArray(),b = s2.toCharArray();
            System.out.println(helper(a,b,0,a.length));
        }
    }
    //以a[count]将位于[s,e)的b分成两半,即找到以a[count]为根节点的左右子树,再对其进行递归
    public static String helper(char[] a,char[] b,int s,int e){
        if(s >= e) return "";
        char c = a[count++];
        int i = s;
        while(i < e){
            if(b[i] == c) break;
            i++;
        }
        String l = helper(a,b,s,i),r = helper(a,b,i + 1,e),res = l + r + c;
        return res;
    }
}


编辑于 2019-01-13 21:47:14 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{
    private static void postOrder(String a,String b,BinTree t){
        
        order(a,b,t);
    }
    
    private static void order(String a,String b,BinTree t){
        if(a.equals("")||b.equals("")||a==null||b==null) return;
        char root = a.charAt(0);
        t.val = root;
       
        if (a.length()==1) {
            return;
        }
        int rootIndex = b.indexOf(root);
        String b_left = b.substring(0,rootIndex);
        String b_right = b.substring(rootIndex+1, b.length());
        if (!b_left.equals("")) {
            t.left = new BinTree();
            order(a.substring(1, b_left.length()+1), b_left, t.left);
            
        }
        if (!b_right.equals("")) {
            t.right = new BinTree();
            order(a.substring(rootIndex+1, a.length()), b_right, t.right);
            
        }
        
    }
    private static void print(BinTree t) {
        if (t.left!=null) {
            print(t.left);
        }
        if (t.right!=null) {
            print(t.right);
        }
        
            System.out.print(t.val);
        
        
    }
    public static void main(String[] args)throws IOException{
        BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
        String a,b;
        BinTree tree;
    while((a = reader.readLine())!=null&&((b = reader.readLine())!=null)){
        tree = new BinTree();
        postOrder(a,b,tree);
        print(tree);
        
    }
    }
}
class BinTree{
    char val;
    BinTree left = null;
    BinTree right = null;
}

发表于 2019-01-06 16:13:47 回复(0)
import java.util.Scanner;
public class Main {
char data;
Main left;
Main right;
public static void main(String[] args) {
String[]arr =new String[2];
Scanner input=new Scanner(System.in);
Main ma=null;
while(input.hasNext()){
String n=input.nextLine();
arr[0]=n;
arr[1]=input.nextLine();
   ma=new Main(arr[0].charAt(0));
   ma.xxx(ma,arr);
   yyy(ma);
   System.out.println();
   ma=new Main(arr[0].charAt(0));
}}
public Main(char data) {
this.data=data;
left=null;
right=null;
}
public void xxx(Main root,String[] arr){
int n=arr[1].indexOf(arr[0].charAt(0));
if(n>1){
String[] str=new String[2];
str[1]=arr[1].substring(0, n);
//System.out.println(str[1]+"左a");
str[0]=arr[0].substring(1, n+1);
//System.out.println(str[0]+"左b");
root.left=new Main(str[0].charAt(0));
xxx(root.left,str);
}else if(n==1){
root.left=new Main(arr[1].charAt(0));
}
if(arr[0].length()-1-n>1){
String[] str=new String[2];
str[1]=arr[1].substring(n+1, arr[1].length());
//System.out.println(str[1]+"右a");
str[0]=arr[0].substring(n+1,arr[0].length());
//System.out.println(str[0]+"右b");
root.right=new Main(str[0].charAt(0));
xxx(root.right,str);
}else if(arr[0].length()-1-n==1){
root.right=new Main(arr[1].charAt(n+1));
}
}
public static void yyy(Main root){
if(root!=null){
 yyy(root.left);
  yyy(root.right);
  System.out.print(root.data);
 }
}
}
发表于 2017-04-17 15:10:28 回复(0)
import java.util.Scanner;

class TreeNode {
    TreeNode(char val) {
        this.val = val;
    }
    char val;
}
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String pr = scanner.next();
            String in = scanner.next();
            binaryTreeFromOrderings(in, pr, pr.length());
            System.out.println();
        }
    }
    public static void binaryTreeFromOrderings(String inOrder, String prOrder, int length){
        if(length == 0)
            return;
        TreeNode node = new TreeNode(prOrder.toCharArray()[0]);
        int i=0;
        for(; i < length; i++){
            if(inOrder.toCharArray()[i] == prOrder.toCharArray()[0]){
                break;
            }
        }
        binaryTreeFromOrderings(inOrder, prOrder.substring(1), i);
        binaryTreeFromOrderings(inOrder.substring(i + 1), prOrder.substring(i + 1), length - (i + 1));
        System.out.print(node.val);
        return;
    }
}

编辑于 2016-10-25 20:51:23 回复(0)