BSTIterator-Iterador de árbol de búsqueda binaria

Título

Implemente una clase de iterador de árbol de búsqueda binaria BSTIterator, que representa un iterador que atraviesa el árbol de búsqueda binaria (BST) en orden:

BSTIterator (TreeNode root) inicializa un objeto de la clase BSTIterator. La raíz del nodo raíz de la BST se proporcionará como parte del constructor
. El puntero debe inicializarse a un número que no existe en la BST, y el número es menor que cualquier elemento en la BST.
boolean hasNext () Devuelve verdadero si hay números atravesando a la derecha del puntero; de lo contrario, devuelve falso.
int next () mueve el puntero hacia la derecha y luego devuelve el número en el puntero.

Tenga en cuenta que el puntero se inicializa a un número que no existe en la BST, por lo que la primera llamada a next () devolverá el elemento más pequeño en la BST.

Puede suponer que la llamada a next () siempre es válida, es decir, cuando se llama a next (), hay al menos un número siguiente en el recorrido en orden de la BST.

Ejemplo:

输入
[“BSTIterator”, “siguiente”, “siguiente”, “hasSiguiente”, “siguiente”, “hasSiguiente”, “siguiente”, “hasSiguiente
”, “siguiente”, “hasSiguiente”]
[[[7, 3, 15 , nulo, nulo, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[nulo, 3, 7, verdadero, 9, verdadero, 15, verdadero, 20, falso]

Interpretar
BSTIterator bSTIterator = new BSTIterator ([7, 3, 15, null, null, 9, 20]);
bSTIterator.next (); // devuelve 3
bSTIterator.next (); // devuelve 7
bSTIterator.hasNext (); // devuelve True
bSTIterator.next (); // devuelve 9
bSTIterator.hasNext (); // devuelve True
bSTIterator.next (); // devuelve 15
bSTIterator.hasNext (); // devuelve True
bSTIterator.next (); // devuelve 20
bSTIterator.hasNext (); // devuelve False

inmediato:

El número de nodos en el árbol está dentro del rango [1, 105]
0 <= Node.val <= 106
Llamar hasNext y operaciones siguientes hasta 105 veces

Avanzado:

¿Puede diseñar una solución que cumpla con las siguientes condiciones? Las operaciones next () y hasNext () tienen una complejidad de tiempo promedio de O (1) y usan memoria O (h). Donde h es la altura
del árbol .

Condiciones complementarias


  Definition for a binary tree node.
  public class TreeNode {
    
    
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {
    
    }
      TreeNode(int val) {
    
     this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
    
    
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

Ideas para resolver problemas

Recorre en orden medio, coloca los nodos del árbol en una lista

Demostración de código

class BSTIterator {
    
    

    List<Integer> list=new ArrayList<>();
    //定义两个变量,count作为一个指针在list中遍历,num存放list的大小
    int count=0;
    int num=0;
    public BSTIterator(TreeNode root) {
    
    
        digui(root);

    }
    //用递归左右子树按照中序遍历入树
    public void digui(TreeNode root)
    {
    
    
        if(root.left!=null)
        {
    
    
            digui(root.left);
            list.add(root.val);
        }
        else
        {
    
    
            list.add(root.val);
        }
        if(root.right!=null)
            digui(root.right);
        num=list.size();
    }
    
    public int next() {
    
    
        return hasNext() ? list.get(count++) : null;
    }
    
    public boolean hasNext() {
    
    
       return count<=num-1 ;
    }
}

efecto

La
respuesta de información fue exitosa:
tiempo de ejecución: 22 ms, derrotando al 95.60% de los usuarios de Java
Consumo de memoria: 41.5 MB, derrotando al 99.75% de los usuarios de Java

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/115276460
Recomendado
Clasificación