Sword se refiere a Offer54-el k-ésimo nodo más grande del árbol de búsqueda binaria-fácil

Enlace de pregunta

Descripción del Título:

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

Por ejemplo, ingrese:

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

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

rango de datos:

1 ≤ k ≤ 二叉搜索树元素个数

Ideas de resolución de problemas:

En un árbol de búsqueda binaria, todos los nodos del subárbol izquierdo son más pequeños que el nodo raíz y todos los del subárbol derecho son más grandes que el nodo raíz. Todos los nodos de los subárboles izquierdo y derecho cumplen esta regla.
La secuencia transversal de orden medio del árbol de búsqueda binaria es una secuencia creciente. Pero lo que quiere esta pregunta es el k-ésimo nodo más grande. Por lo tanto, se requiere el orden inverso del recorrido de orden medio.
Secuencia transversal recursiva: 1. Subárbol derecho 2. Nodo raíz 3. Subárbol izquierdo
Utilice un num para registrar el número actual de valores Cuando num == k, la recursividad se puede terminar antes.

Código de CA (c ++)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    void dfs(TreeNode * root,int k,int &num,int &ans){
    
    
        if(!root)
            return;
        dfs(root->right,k,num,ans);
        num++;
        if(num==k)
        {
    
    
            ans = root->val;
            return;
        }
        dfs(root->left,k,num,ans);
        
        
    }
    int kthLargest(TreeNode* root, int k) {
    
    
        int ans=0;
        int num=0;
        dfs(root,k,num,ans);
        return ans;
    }
};

Supongo que te gusta

Origin blog.csdn.net/Yang_1998/article/details/113049112
Recomendado
Clasificación