Entrevista al programador preguntas clásicas doradas de la entrevista 04.08. El primer antepasado común

1. Introducción al tema

Diseñe e implemente un algoritmo para encontrar el primer ancestro común de dos nodos en el árbol binario. No almacene otros nodos en otra estructura de datos. Nota: Este no es necesariamente un árbol de búsqueda binario.

Por ejemplo, dado el siguiente árbol binario: root = [3,5,1,6,2,0,8, null, null, 7,4]

    3
   / \
  5 1
 / \ / \
6 2 0 8
  / \
 7 4
Ejemplo 1:

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

Entrada: raíz = [3,5,1,6,2,0,8, nulo, nulo, 7,4], p = 5, q = 4
Salida: 5
Explicación: El ancestro común más cercano del nodo 5 y el nodo 4 es Nodo 5. Porque, por 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 binario dado.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/first-common-ancestor-lcci
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos ideas para resolver problemas

        Este problema utiliza una solución recursiva. Hay tres situaciones para los nodos que se deben buscar: (1) Uno de los nodos es el nodo raíz, luego el nodo raíz es el primer ancestro común; (2) Dos nodos están ubicados en los hijos izquierdo y derecho del nodo raíz. En el árbol, el nodo raíz es el primer antepasado común; (3) Si ambos nodos están en el subárbol izquierdo o en el subárbol derecho del nodo raíz, siga las reglas (1) y (2) de forma recursiva en el subárbol izquierdo o Encuentra el ancestro común en el subárbol de la derecha.

Tres, código de resolución de problemas

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == p || root == q || root == NULL)
            return root;
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if(left && right)
            return root;
        return left ? left : right;
    }
};

Cuatro, resultados de resolución de problemas

 

Supongo que te gusta

Origin blog.csdn.net/qq_39661206/article/details/108060831
Recomendado
Clasificación