Likou 235 El ancestro común más cercano en el árbol de búsqueda binaria

Enlace de título: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree

Dado un árbol de búsqueda binario, encuentre el ancestro común más cercano de dos nodos especificados en el árbol.

La definición del ancestro común más cercano en la Enciclopedia Baidu es: "Para los dos nodos pyq del árbol enraizado T, el ancestro común más cercano se expresa como un nodo x, satisfaciendo que x es el ancestro de pyq y la profundidad de x es lo más grande posible (un nodo también puede ser su propio antepasado) ".

Por ejemplo, dado el siguiente árbol de búsqueda binaria: root = [6,2,8,0,4,7,9, null, null, 3,5]

 

Ejemplo 1:

Entrada: raíz = [6,2,8,0,4,7,9, nulo, nulo, 3,5], p = 2, q = 8
Salida: 6 
Explicación: El ancestro común más cercano del nodo 2 y del nodo 8 es 6.
Ejemplo 2:

Entrada: raíz = [6,2,8,0,4,7,9, nulo, nulo, 3,5], p = 2, q = 4
Salida: 2
Explicación: El ancestro común más cercano del nodo 2 y del nodo 4 es 2, porque según la definición, el nodo ancestro común más cercano puede ser el propio nodo.
 

Descripción:

  • Los valores de todos los nodos son únicos.
  • pyq son nodos diferentes y ambos existen en el árbol de búsqueda binario dado.

 

        En realidad, es muy simple. Tenga en cuenta que la solicitud es devolver el nodo, no el valor. Debido a que es un árbol de búsqueda binario, los valores de todos los nodos en el subárbol izquierdo de un nodo son menores o iguales al valor de este punto, y los valores de todos los nodos en el subárbol izquierdo son mayores o iguales que igual al valor de este punto, el primero en la descripción del título original Artículo "El valor de todos los nodos es único" entonces no hay igual a la situación anterior. Es decir, para el nodo raíz, si el valor de cualquier nodo es menor que su valor, entonces el nodo se ubica en su subárbol izquierdo, y si es mayor que se ubica en el subárbol derecho. Si dos nodos están ubicados en los subárboles izquierdo y derecho del nodo raíz (es decir, el valor del nodo raíz está entre los valores de los dos nodos), es obvio que su ancestro común más cercano es el nodo raíz; de lo contrario, los dos nodos están ubicados al mismo tiempo en los subárboles izquierdo y derecho del nodo raíz (es decir, ambos nodos son más grandes o más pequeños que el valor del nodo raíz), entonces el ancestro común más cercano de los dos nodos es también se encuentra en los subárboles izquierdo y derecho, y se introduce el valor del ancestro común más cercano entre los valores de los dos nodos.

        El algoritmo se puede completar mediante recursividad / iteración. La entrada es el nodo raíz del subárbol y los dos nodos py q. Sea vallow el valor mínimo de los dos valores de nodo de pyq, y valhigh es el valor máximo, entonces:

  1. Si el valor de la raíz es mayor o igual que el valor de vallow pero menor o igual que el valor de valhigh, significa que está entre los dos valores, y los dos nodos están ubicados en sus subárboles izquierdo y derecho, entonces root es su ancestro común más cercano;
  2. De lo contrario, si el valor de root es mayor que el valor de valhigh, significa que los valores de los dos nodos son ambos menores que el valor de root, es decir, ambos están ubicados en el subárbol izquierdo, luego ingrese el izquierdo subárbol de raíz para buscar;
  3. De lo contrario, el valor de root es menor que el valor de vallow, lo que indica que los valores de los dos nodos son mayores que el valor de root, es decir, ambos están ubicados en el subárbol derecho, y luego ingresan al subárbol derecho de root para buscar.

       La razón del signo igual en ambos lados en el caso 1 es que el nodo ancestro común más cercano puede ser el nodo mismo, por lo que si hay una situación igual, significa que uno de los dos nodos es el nodo raíz.

Método recursivo:

/**
 * 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:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        int vallow=min(p->val,q->val);
        int valhigh=max(p->val,q->val);
        if (vallow<=root->val && valhigh>=root->val)
            return root;
        else if(valhigh<root->val)
            return lowestCommonAncestor(root->left,p,q);
        else
            return lowestCommonAncestor(root->right,p,q);
        }
};

Método iterativo:

/**
 * 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:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* r=root;
        int vallow=min(p->val,q->val);
        int valhigh=max(p->val,q->val);
        while(r){
            if (vallow<=r->val && valhigh>=r->val)
                break;//其实这行可以直接return r的,但是不通过
            else if(valhigh<r->val)
                r=r->left;
            else
                r=r->right;
        }
        return r;
    }
};

 

Supongo que te gusta

Origin blog.csdn.net/qq_36614557/article/details/108835718
Recomendado
Clasificación