Java construye un árbol binario basado en el recorrido de preorden

Cree un árbol binario basado en el recorrido de preorden

Tema Descripción

Escriba un programa que lea una cadena de cadenas transversales de preorden ingresadas por el usuario y construya un árbol binario (almacenado por punteros) basado en las cadenas. Por ejemplo, la siguiente cadena transversal de preorden: ABC##DE#G##F### donde "#" representa un espacio y el carácter de espacio representa un árbol vacío. Después de establecer el árbol binario, realice un recorrido en orden en el árbol binario y emita el resultado del recorrido.
Descripción de entrada:
la entrada incluye 1 línea de cadenas, cuya longitud no supera los 100.
Descripción de salida:
puede haber varios conjuntos de datos de prueba. Para cada conjunto de datos, genera la secuencia de recorrido en orden después de que la cadena de entrada se construya como un árbol binario. Hay un espacio después de cada carácter. Cada salida ocupa una línea.

ejemplo

inserte la descripción de la imagen aquí

Título original DO enlace

https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

respuesta

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
class   TreeNode{
    
    //创建一个树结点的类,这个类最后不要构建在Main类了里面,构建在里面是内部类
        char val;
        TreeNode left;
        TreeNode right;

        public TreeNode(char ch){
    
    
            this.val = ch;
            this.left = null;
            this.right = null;
        }

}
public class Main {
    
     
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) {
    
     // 注意 while 处理多个 case
            String str = in.nextLine();
            TreeNode root = creatTree(str);
            midOrder(root);
        }
    }
    public static int i = 0;//必须是静态的,不然在creatTree这个静态方法里面没法用
    //构建二叉树
    public static TreeNode creatTree(String str){
    
    
        TreeNode root = null;
        if(str.charAt(i) != '#'){
    
    //只要值不是#,就证明是结点,所以先把结点创建出来
            root = new TreeNode(str.charAt(i));
            i++;
            root.left = creatTree(str);
            root.right = creatTree(str);
        }
        else{
    
    
           i++;//本题是不需要判断i是否越界的,因为只有给定的str是合法的前驱遍历,那么i就不会无限增加,因为有递归次数做保证

        }
        return root;

    }
    //中序遍历
    public static void midOrder(TreeNode root){
    
    
        if(root == null){
    
    
            return;
        }
        midOrder(root.left);
        System.out.print(root.val + " ");
        midOrder(root.right);

    }
}

Supongo que te gusta

Origin blog.csdn.net/baixian110/article/details/130954430
Recomendado
Clasificación