Reconstruya la implementación de Java del árbol binario de acuerdo con la secuencia transversal de pedido previo y la secuencia transversal en orden

Descripción del problema

Se le proporciona una matriz para el recorrido en orden previo y una matriz para el recorrido en orden, respectivamente, y debe construir el árbol binario. Suponga que ni el recorrido en orden previo de entrada ni los resultados del recorrido en orden contienen números duplicados. Por ejemplo, ingrese la secuencia transversal en orden previo {1,2,4,7,3,5,6,8} y la secuencia transversal en orden {4,7,2,1,5,3,8,6}, luego reconstruya el árbol binario y volver.

análisis del problema

El orden transversal del árbol binario:
orden previo: raíz izquierda y derecha
orden medio: raíz izquierda derecha
orden posterior: raíz izquierda y derecha

El nodo raíz correspondiente se puede conocer a partir de la secuencia transversal en preorden, y la posición del nodo raíz en la secuencia transversal en orden separa el subárbol izquierdo y el subárbol derecho.
Luego, construya recursivamente un árbol binario en el subárbol izquierdo y en el subárbol derecho a su vez.

Código

/**
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *
 *     public TreeNode(int val) {
 *         this.val = val;
 *     }
 * }
 */


package treeAlgorithm;

import java.util.Arrays;

public class ReConstructBinaryTree {
    
    
    public static void main(String[] args) {
    
    
        int[] pre = {
    
    1,2,4,7,3,5,6,8};
        int[] in = {
    
    4,7,2,1,5,3,6,8};
        TreeNode treeNode = reConstructBinaryTree(pre, in);
        prePost(treeNode);

    }
     /**
     * 
     * @param pre 先序遍历序列
     * @param in 中序遍历序列
     * @return
     */
    public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
    
    
        if(pre.length == 0 || in.length == 0)
            return null;
        TreeNode root = new TreeNode(pre[0]);
        for (int i = 0; i < in.length; i++) {
    
    
            if(in[i] == pre[0]){
    
    
                //左子树,copyOfRange函数是左闭右开
                root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
                //递归构建左子树
                root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
                break;
            }
        }
        return root;
    }
     /**
     * 对构建的树进行先序遍历,验证结果
     * @param root
     */
    public static void prePost(TreeNode root){
    
    
        if(root == null)
            System.out.println("空树");
        System.out.println(root.val);

        if(root.left != null)
            prePost(root.left);

        if(root.right!= null)
            prePost(root.right);
    }
}

resumen

Este tipo de pregunta de algoritmo examina principalmente la estructura y las características del árbol binario. Es necesario dominar las tres reglas transversales del árbol binario con soltura. Al mismo tiempo, es necesario comprender que la definición del árbol es recursiva, por lo que la recursividad se utiliza para resolver este tipo de problema.

Supongo que te gusta

Origin blog.csdn.net/weixin_42643321/article/details/108515402
Recomendado
Clasificación