Dos pasos de recorrido de árbol binario


Cruce de jerarquía de árbol binario, use la cola de esta estructura de datos.

1. Recorrido de nivel de árbol binario (1)

La idea es: primero ponga el nodo seguidor en la cola, cuando la cola no esté vacía, saque un nodo de la cola cada vez y acceda a sus subárboles izquierdo y derecho en la cola al mismo tiempo. (Por supuesto, ingresa a la cola solo cuando su subárbol no está vacío)

Descripción del Título

Dado un árbol binario, devuelve el valor de sus nodos atravesados ​​por nivel. (Es decir, visite todos los nodos capa por capa, de izquierda a derecha).

Por ejemplo:
Dado un árbol binario: [3,9,20, null, null, 15,7],
3
/ \
9 20
/ \
15 7
devuelve el resultado de su recorrido de nivel:

[
[3],
[9,20],
[15,7]
]

Ideas

Primero coloque el nodo seguidor en la cola, cuando la cola no esté vacía, saque un nodo de la cola cada vez, visítelo y coloque sus subárboles izquierdo y derecho en la cola al mismo tiempo. (Por supuesto, ingresa a la cola solo cuando su subárbol no está vacío)

Nota : El uso del bucle for en el medio es para organizar los resultados de cada capa en una lista, por lo que cada vez que se recorren todos los nodos de la cola actual, es decir, todos los nodos de la capa actual, para que puedan ser poner en una lista, satisfaga el formulario de resultado en la pregunta.

Código Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        if(root == null) return result;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            int size = q.size();
            temp = new ArrayList<>();
            for(int i = 0;i<size;i++){
                TreeNode node = q.poll();
                temp.add(node.val);
                if(node.left!=null)
                    q.offer(node.left);
                if(node.right!=null)
                    q.offer(node.right);
            }
            result.add(temp);
        }
        return result;
    }
}

Como comparación: el ejemplo de recorrido de nivel en los libros de texto tradicionales solo requiere imprimir los resultados del recorrido de nivel y no requiere salida en forma de una lista bidimensional en el título. Eso sería más simple, y el bucle for medio no es necesario, porque no requiere que los nodos de una capa estén organizados en una lista.

Código Java (impresión transversal de jerarquía)

public void levelOrder(TreeNode root) {
        if(root == null) return result;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
                TreeNode node = q.poll();
                //打印节点
                System.out.println(node.val);
 				//子节点入队列
                if(node.left!=null)
                    q.offer(node.left);
                if(node.right!=null)
                    q.offer(node.right);
        }
    }

2. Cruce de nivel de árbol binario (dos)

Descripción del Título

Dado un árbol binario, devuelve su valor de nodo para recorrerlo de abajo hacia arriba. (Es decir, desde la capa donde se encuentra el nodo hoja hasta la capa donde se encuentra el nodo raíz, atravesando de izquierda a derecha capa por capa)

Por ejemplo:
Dado un árbol binario [3,9,20, null, null, 15,7],
3
/ \
9 20
/ \
15 7
devuelve su recorrido de nivel ascendente como:

[
[15,7],
[9,20],
[3]
]

Ideas

Mira, ¿no es esto solo el resultado de la primera pregunta "Nivel transversal"? La pregunta anterior es atravesar de arriba hacia abajo, y esta pregunta es atravesar de abajo hacia arriba. Entonces puede agregar la oración Collections.reverse (resultado) al final del código en la pregunta anterior.

De hecho, ¿dónde es necesario obtener el resultado y luego darle la vuelta? Cuando se genera la lista de resultados, cada inserción desde el principio es el resultado opuesto. No olvide que List tiene una función list.add (0, item), puede elegir agregarla a cualquier posición de la Lista.

Código Java

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root == null) return result;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            int size = q.size();
            List<Integer> tmp = new ArrayList<>();
            for(int i = 0;i<size;i++){
                TreeNode node = q.poll();
                tmp.add(node.val);
                if(node.left!=null) q.offer(node.left);
                if(node.right!=null) q.offer(node.right);
            }
            result.add(0,tmp);//每次添加到头部
        }
        return result;
    }
}

Supongo que te gusta

Origin blog.csdn.net/fxjzzyo/article/details/88270675
Recomendado
Clasificación