Estructura de datos y análisis de algoritmos----árbol binario + orden previo + orden interior + orden transversal transversal

Descripción general del árbol binario

Conozca la lista de enlaces simples, cada nodo de la lista de enlaces simples solo puede tener un nodo sucesor. Una lista enlazada, suponiendo que cada nodo no puede tener más de dos nodos sucesores, entonces puede llamarse árbol binario. En este momento, los nodos en este árbol binario se llaman nodos, y los nodos sucesores del árbol binario se llaman Se llama nodo secundario y tiene puntos izquierdo y derecho. El nodo secundario izquierdo de un nodo es el nodo secundario izquierdo, y el nodo secundario derecho es el nodo secundario derecho.
como:
inserte la descripción de la imagen aquíDe la Enciclopedia Baidu
Cada letra aquí representa un nodo.
Un árbol binario no tiene que ser implementado por una lista enlazada. Es una estructura de datos y una estructura. Siempre que tenga esta estructura, puede llamarse árbol binario.
Enciclopedia de Baidu:
árbol binario (árbol binario) es un tipo importante de estructura de árbol. La estructura de datos abstraída de muchos problemas prácticos a menudo tiene la forma de un árbol binario.Incluso un árbol general se puede convertir fácilmente en un árbol binario, y la estructura de almacenamiento y el algoritmo del árbol binario son relativamente simples, por lo que el árbol binario es particularmente importante. La característica de un árbol binario es que cada nodo solo puede tener como máximo dos subárboles, y hay puntos izquierdo y derecho.
Términos relacionados:
① Nodo: contiene un elemento de datos y cierta información que apunta a las ramas del subárbol.
② Grado de un nodo: el número de subárboles que tiene un nodo se denomina grado de un nodo.
③Nodo hoja: también conocido como nodo terminal, nodo sin subárbol o nodo con grado cero.
④Nodo de rama: también conocido como nodo no terminal, el nodo cuyo grado no es cero se llama nodo no terminal.
⑤ Grado del árbol: el valor máximo de los grados de todos los nodos del árbol.
⑥El nivel de los nodos: a partir del nodo raíz, asumiendo que el nodo raíz es la primera capa, los nodos secundarios del nodo raíz son la segunda capa, y así sucesivamente, si un nodo está ubicado en la capa L, sus nodos secundarios Ubicado en el nivel L+1.
⑦La profundidad del árbol: también conocida como la altura del árbol, el nivel máximo de todos los nodos del árbol se denomina profundidad del árbol.
⑧Árbol ordenado: si el orden de cada subárbol en el árbol es secuencial, el árbol se denomina árbol ordenado.
⑨Árbol desordenado: si el orden de cada subárbol en el árbol no está en orden, el árbol se denomina árbol desordenado.
⑩Bosque: Un bosque se compone de m (m≥0) árboles disjuntos. Si se elimina el nodo raíz de un árbol no vacío, el árbol se convierte en un bosque y los árboles del bosque se componen de los subárboles del nodo raíz original.

Dos árboles binarios especiales:
1. Árbol binario completo: si un árbol binario tiene solo nodos con grado 0 y nodos con grado 2, y los nodos con grado 0 están en el mismo nivel, entonces el árbol binario es un árbol binario completo.
2. Árbol binario completo: Un árbol binario con una profundidad de k y n nodos se dice completo si y solo si cada nodo corresponde a los nodos numerados del 1 al n en un árbol binario completo con una profundidad de k.
La característica de un árbol binario completo es que los nodos hoja solo pueden aparecer en las dos capas más grandes de la secuencia, y la secuencia máxima de descendientes debajo de la rama izquierda de un nodo es igual o mayor que la secuencia máxima de descendientes debajo de la derecha. rama por 1.

En pocas palabras, un árbol binario completo: la penúltima capa de nodos está llena y debe haber un nodo en el extremo izquierdo de la penúltima capa, que es continuo de izquierda a derecha. la llamada continuidad significa que no debe haber espacio vacío entre los dos nodos de hoja.Un
árbol binario es un árbol binario completo, y un árbol binario completo no es necesariamente un árbol binario completo.
inserte la descripción de la imagen aquíDe la Enciclopedia Baidu
La definición de árbol binario completo en China es un poco diferente de la definición de árbol binario completo en países extranjeros, no se preocupe por eso.

atravesar

El recorrido es una de las operaciones más básicas en los árboles.El llamado recorrido de un árbol binario consiste en recorrer todos los nodos del árbol binario de acuerdo con ciertas reglas y orden, de modo que cada nodo se visite una vez y solo una vez. Dado que el árbol binario es una estructura no lineal, el recorrido del árbol es esencialmente para convertir cada nodo del árbol binario en una secuencia lineal para representar.
Hay tres métodos de recorrido, preorden, en orden y seguimiento:
la diferencia entre los tres métodos de recorrido radica en cuándo se imprime el nodo principal.
Si el nodo principal se imprime primero, es el preorden.
Si el orden de entrada es: nodo hijo, nodo padre, nodo hijo, en orden
Si el orden de entrada es: nodo hijo, nodo hijo, nodo padre, entonces orden
Aquí usamos la recursividad para implementar el recorrido del árbol binario
La recursividad de estos recorridos realmente no es fácil de entender. ¿Por qué se puede atravesar un árbol completo? Puede revisarlo con depuración para comprenderlo.

Primero crea un árbol binario

Necesitamos crear una clase de nodo:
inserte la descripción de la imagen aquí
creamos un árbol un poco más complejo, que es más impresionante de atravesar
Crea un árbol con esta estructura:
inserte la descripción de la imagen aquí
créalo así:
inserte la descripción de la imagen aquí

recorrido de pedido anticipado

¿Qué es el recorrido de preorden?
En el proceso de recursión, primero imprima el nodo actual, luego recurra al subnodo izquierdo, la recursión izquierda se completa y inserte la descripción de la imagen aquí
luego recurra al subnodo derecho
,
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí
3 , 4, 7, 9, 10, 11, 12, 13, 2, 5, 6, 8
de hecho correcto

Recorrido en orden

¿Qué es el recorrido en orden? En el proceso de recursión, primero recurra a la izquierda, la recursión izquierda se completa, luego imprime el nodo actual y luego recurre al nodo secundario derecho
inserte la descripción de la imagen aquí
Primero recurra a la izquierda, hasta que el nodo izquierdo llegue al final, luego imprima el nodo actual, luego recurra a la derecha sobre la base del nodo actual, y luego regrese al final, que es lo mismo que el recorrido de preorden anterior , que es Backtrack recursivo
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí
Orden de impresión: 3, 1, 9, 7, 11, 10, 13, 12, 4, 0, 5, 2, 6, 8, sin problema

Recorrido posterior

¿Qué es el recorrido posterior al pedido? En el proceso de recursividad, primero se recurre a la izquierda, se completa la recursividad izquierda, se recurre a la derecha y se completa la recursividad derecha para imprimir el nodo actual
inserte la descripción de la imagen aquí
Se basa en la impresión durante el proceso de seguimiento
Primero recurra a la izquierda, vaya al final, luego recurra a la derecha según el nodo actual, imprima el nodo actual al final y luego retroceda
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí
Secuencia: 3, 9, 11, 13, 12, 10, 7, 4, 1, 5, 8, 6, 2, 0

el código

package com.LYH.structure.Nonlinearity.Tree;

public class BinaryTreeTraversal {
    
    
    public static void main(String[] args) {
    
    
        BinaryTree tree=new BinaryTree();

//        创建14个结点
        Node[] Nodes=new Node[14];
        for (int i = 0; i < 14; i++) {
    
    
            Nodes[i]=new Node(i,"牛蛙"+i+"号");
        }
//        构建结构
        Nodes[0].setLeft(Nodes[1]);
        Nodes[0].setRight(Nodes[2]);
        Nodes[1].setLeft(Nodes[3]);
        Nodes[1].setRight(Nodes[4]);
        Nodes[2].setLeft(Nodes[5]);
        Nodes[2].setRight(Nodes[6]);
        Nodes[4].setLeft(Nodes[7]);
        Nodes[6].setRight(Nodes[8]);
        Nodes[7].setLeft(Nodes[9]);
        Nodes[7].setRight(Nodes[10]);
        Nodes[10].setLeft(Nodes[11]);
        Nodes[10].setRight(Nodes[12]);
        Nodes[12].setLeft(Nodes[13]);
        tree.setRoot(Nodes[0]);
        tree.Traversal();
}
class BinaryTree{
    
    
    private Node root;

    public Node getRoot() {
    
    
        return root;
    }

    public void setRoot(Node root) {
    
    
        this.root = root;
    }
//    三种遍历方式的区别在于父节点什么时候打印,
//    若先输出父节点,则是前序。
//    若输入顺序是:子节点 父节点 子节点   则中序
//    若输入顺序是:子节点 子节点 父节点   则后序

//    遍历
    public void Traversal(){
    
    
        if (root==null){
    
    
            System.out.println("树为空");
        }else {
    
    
//            PreorderTraversal(root); //前序
//            PostorderTraversal(root);//后序
            InfixTraversal(root); //中序
        }
    }
//    前序
    private void PreorderTraversal(Node node){
    
    
        if (node!=null){
    
    
            System.out.println(node);
            PreorderTraversal(node.getLeft());
            PreorderTraversal(node.getRight());
        }
    }

//    中序
    private void InfixTraversal(Node node){
    
    
        if (node!=null){
    
    
            InfixTraversal(node.getLeft());
            System.out.println(node);
            InfixTraversal(node.getRight());
        }
    }

//    后序
    private void PostorderTraversal(Node node){
    
    
        if (node!=null){
    
    
            PostorderTraversal(node.getLeft());
            PostorderTraversal(node.getRight());
            System.out.println(node);
        }
    }
}
class Node{
    
      //假设我们这个结点类存储用户的id和姓名(name)
    private int id;
    private String name;
    private Node left;  //左子结点
    private Node right;  //右子结点

    public Node(int id, String name) {
    
    
        this.id = id;
        this.name = name;
    }

    public Node() {
    
    
    }
    public void setId(int id) {
    
    
        this.id = id;
    }
    public void setName(String name) {
    
    
        this.name = name;
    }
    public void setLeft(Node left) {
    
    
        this.left = left;
    }
    public void setRight(Node right) {
    
    
        this.right = right;
    }
    public int getId() {
    
    
        return id;
    }
    public String getName() {
    
    
        return name;
    }
    public Node getLeft() {
    
    
        return left;
    }
    public Node getRight() {
    
    
        return right;
    }
    @Override
    public String toString() {
    
    
        return "Node{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_45821251/article/details/121453954
Recomendado
Clasificación