Duas etapas de travessia da árvore binária


Percurso de hierarquia de árvore binária, use a fila desta estrutura de dados.

1. Travessia de nível de árvore binária (1)

A ideia é: primeiro coloque o nó seguidor na fila, quando a fila não estiver vazia, tire um nó da fila a cada vez e acesse suas subárvores esquerda e direita na fila ao mesmo tempo. (Claro, ele entra na fila apenas quando sua subárvore não está vazia)

Descrição do título

Dada uma árvore binária, retorna o valor de seus nós percorridos por nível. (Ou seja, visite todos os nós camada por camada, da esquerda para a direita).

Por exemplo:
Dada uma árvore binária: [3,9,20, nulo, nulo, 15,7],
3
/ \
9 20
/ \
15 7
retorna o resultado de sua passagem de nível:

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

Ideias

Primeiro coloque o nó seguidor na fila, quando a fila não estiver vazia, tire um nó da fila a cada vez, visite-o e coloque suas subárvores esquerda e direita na fila ao mesmo tempo. (Claro, ele entra na fila apenas quando sua subárvore não está vazia)

Nota : O uso do loop for no meio é organizar os resultados de cada camada em uma lista, de modo que toda vez que todos os nós na fila atual são percorridos, ou seja, todos os nós na camada atual, para que possam ser colocar em uma lista, satisfaça a forma de resultado da pergunta.

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 comparação: o exemplo de passagem de nível em livros tradicionais requer apenas a impressão dos resultados da passagem de nível e não requer saída na forma de uma lista bidimensional no título. Isso seria mais simples, e o loop for do meio não é necessário, porque não exige que os nós de uma camada sejam organizados em uma lista.

Código Java (impressão de travessia de hierarquia)

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. Percurso de nível de árvore binária (dois)

Descrição do título

Dada uma árvore binária, retorne seu valor de nó para percorrer de baixo para cima. (Ou seja, da camada onde o nó folha está localizado até a camada onde o nó raiz está localizado, passando da esquerda para a direita camada por camada)

Por exemplo:
Dada uma árvore binária [3,9,20, nulo, nulo, 15,7],
3
/ \
9 20
/ \
15 7
retorna sua passagem de nível de baixo para cima como:

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

Ideias

Olha, isso não é apenas o resultado da primeira pergunta "Level Traversal"! A questão anterior é percorrer de cima para baixo e esta questão é percorrer de baixo para cima. Portanto, você pode adicionar a frase Collections.reverse (resultado) no final do código da pergunta acima.

Na verdade, onde é necessário obter o resultado e depois invertê-lo. Quando a lista de resultados é gerada, cada inserção desde o início é o resultado oposto. Não se esqueça de que List tem uma função list.add (0, item), você pode escolher adicioná-la a qualquer posição da List.

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;
    }
}

Acho que você gosta

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