[Oferta LeetCode-Sword Finger] 54. El k-ésimo nodo más grande del árbol de búsqueda binaria

1. Tema

Dado un árbol de búsqueda binario, encuentre el k-ésimo nodo más grande en él.

Ejemplo 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

Ejemplo 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

límite:

  • 1 ≤ k ≤ número de elementos del árbol de búsqueda binaria

Dos, resolver

1. Recurrencia

Ideas:

Naturaleza : el recorrido de orden medio del árbol de búsqueda binaria es una secuencia creciente .

Corolario: el orden inverso del recorrido de orden medio del árbol de búsqueda binaria es una secuencia descendente.
Por lo tanto, encontrar el knodo más grande del árbol de búsqueda binaria se puede transformar en encontrar el primer knodo en el orden inverso al recorrido de orden medio de este árbol .
1

Código:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    int res, k;
    public int kthLargest(TreeNode root, int k) {
    
    
        this.k = k;
        dfs(root);
        return res;
    }
    void dfs(TreeNode root) {
    
    
        if(root == null) return;
        dfs(root.right);
        if(k == 0) return;
        if(--k == 0) res = root.val;
        dfs(root.left);
    }
}

Complejidad del tiempo: O (n) O (n)O ( n )
complejidad espacial: O (n) O (n)O ( n )

2. Iteración

Ideas:

Plantilla de código transversal en orden de árbol binario:

public List<Integer> inorderTraversal(TreeNode root) {
    
    
    List<Integer> result = new ArrayList<>();
    Deque<TreeNode> stack = new ArrayDeque<>();
    TreeNode p = root;
    while(!stack.isEmpty() || p != null) {
    
    
        if(p != null) {
    
    
            stack.push(p);
            p = p.left;
        } else {
    
    
            TreeNode node = stack.pop();
            result.add(node.val);  // Add after all left children
            p = node.right;   
        }
    }
    return result;
}

Modifique la plantilla anterior y cambie el orden transversal original izquierda-raíz-derecha a derecha-raíz-izquierda .

Código:

class Solution {
    
    
    public int kthLargest(TreeNode root, int k) {
    
    
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode p = root;
        while(!stack.isEmpty() || p != null) {
    
    
            if(p != null) {
    
    
                stack.push(p);
                p = p.right;
            } else {
    
    
                TreeNode node = stack.pop();
                if (--k == 0) return node.val;
                p = node.left;   
            }
        }
        return 0;
    }
}

Complejidad del tiempo: O (n) O (n)O ( n )
complejidad espacial: O (1) O (1)O ( 1 )

Tres, referencia

1. Pregunta de la entrevista 54. El k-ésimo nodo más grande del árbol de búsqueda binaria (recorrido en orden + retorno temprano, ilustración clara)

Supongo que te gusta

Origin blog.csdn.net/HeavenDan/article/details/110920837
Recomendado
Clasificación