La entrevista debe ser: construcción del árbol de búsqueda binaria (árbol de clasificación binaria), inserción, diagrama detallado de verificación, la abuela lo entiende y el código Python de dos métodos de verificación del árbol de búsqueda binaria

1. La naturaleza del árbol de ordenación binaria:

Puede ser un árbol vacío o un árbol binario con las siguientes propiedades:

(1) Si su subárbol izquierdo no está vacío, los valores de todos los nodos en el subárbol izquierdo son menores que el valor de su nodo raíz;

(2) Si su subárbol derecho no está vacío, los valores de todos los nodos del subárbol derecho son mayores que el valor de su nodo raíz;

(3) Sus subárboles izquierdo y derecho son respectivamente árboles de clasificación binaria.

Propiedades importantes:

1. La salida del recorrido de orden medio del árbol de ordenación binaria debe ser una secuencia que aumenta monótonamente.
2. La búsqueda de un valor especificado en un árbol de ordenación binaria es equivalente a una búsqueda binaria.

2. Un ejemplo de un árbol de ordenamiento binario:

El árbol binario de la figura siguiente es un árbol de ordenación binario típico:
Inserte la descripción de la imagen aquí
dado que el árbol de ordenación binario tiene la palabra sort en su nombre, esta es su ventaja sobre el árbol binario ordinario.

Los límites superior e inferior de cada nodo del árbol de clasificación binaria se muestran en la siguiente figura. La construcción y la inserción se basan en las condiciones de los límites para determinar la posición de inserción:
Inserte la descripción de la imagen aquí

3. Ejemplos de construcción de árboles de ordenación binaria y reglas de inserción:

Suponga que tenemos la siguiente secuencia desordenada al principio:
Inserte la descripción de la imagen aquí
Paso 1: Inserte 8 como nodo raíz.
Inserte la descripción de la imagen aquí

Paso 2: Inserte 3 y compárelo con el nodo raíz 8. Si se encuentra que es menor que 8, y el nodo raíz no tiene un hijo izquierdo, entonces inserte 3 en el hijo izquierdo de 8.
Inserte la descripción de la imagen aquí
Paso 3: Inserte 10, primero compárelo con el nodo raíz y descubra que es mayor que 8, luego inserte 10 en el subárbol derecho del nodo raíz; si el subárbol derecho del nodo raíz 8 está vacío, use 10 como el derecho subárbol de 8 niños.
Inserte la descripción de la imagen aquí
Paso 4: Inserte 1, primero compárelo con el nodo raíz, que es más pequeño que el nodo raíz, luego inserte el subárbol izquierdo del nodo raíz. Luego compare con el hijo izquierdo 3 del nodo raíz, y encuentre que es menor que 3, entonces se debe insertar el hijo izquierdo de 3.
Inserte la descripción de la imagen aquí
Paso 5: Inserte 6, y primero compare con el nodo raíz 8, si es menor que 8, vaya a la izquierda; luego compare con 3, si es mayor que 3, vaya a la derecha, y si no hay nodo, entonces use 6 como el hijo correcto de 3.
Inserte la descripción de la imagen aquí
Paso 6: Inserte 14, primero compare con 8, que es mayor que 8, y vaya a la derecha; luego compare con el hijo derecho de 8, 10, que es mayor que 10 y vaya a la derecha. Si no hay ningún nodo, entonces 14 será considerado como el niño correcto de 10 años.
Inserte la descripción de la imagen aquí
Paso 7: Inserte 4, compare con 8, encuentre que es menor que 8, vaya a la izquierda, luego compare con 3, vaya a la derecha si es mayor que 3, y compare con 6, vaya a la izquierda y allí no es un hijo izquierdo, use 4 como 6 hijo izquierdo.
Inserte la descripción de la imagen aquí
Paso 8: Inserte 7, primero compare con 8, encuentre que es más pequeño que 8, vaya a la izquierda, luego compare con 3, vaya a la derecha, compare con 6, continúe a la derecha, encuentre que 6 no tiene un hijo correcto, luego use 7 como se inserta el hijo derecho de 6 años.
Inserte la descripción de la imagen aquí
Paso 9: Inserte 13, primero compare con 8 (mayor que) a la derecha, luego compare con 10 (mayor que) a la derecha, luego compare con 14 (menor que) a la izquierda, encuentre que el hijo izquierdo de 14 es vacío, luego inserte 13 en la posición infantil izquierda de 14.
Inserte la descripción de la imagen aquí

4. Resultados de recorrido de orden medio:

Inserte la descripción de la imagen aquí

5. Método de verificación

(1) Verificación del recorrido de orden medio (el recorrido de orden medio del árbol de búsqueda binaria debe ser una secuencia que aumenta monótonamente)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        def recur(root: TreeNode)->[]:
            return recur(root.left)+[root.val]+recur(root.right) if root else []
        res = recur(root)
        return all(res[i]>res[i-1] for i in range(1, len(res)))

(2) Verificación de reglas de construcción (use los límites superior e inferior de cada nodo para determinar si es un árbol de búsqueda)

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        return self.dg(root,-(2**32),2**32) #这里我直接粗暴地将最小值和最大值设置为一个足够小(大)的数,你可以设置你认为的最优解

    def dg(self, root, min_v, max_v): 
        # 参数:root:当前节点,min_v:允许最小值(下界),max_v:允许最大值(上界)
        if not root:
            return True
        # 同时满足所有条件才是二叉搜索树:
        # 1、当前节点root.val在上下界范围内;2、当前节点的左孩子是二叉搜索树;3、当前节点的右孩子是二叉搜索树
        if min_v<root.val<max_v and self.dg(root.left, min_v, root.val) and self.dg(root.right, root.val, max_v):
            return True
        return False

Adjunto: los límites superior e inferior de cada nodo, por lo que no tiene que mostrar el abuelo
Inserte la descripción de la imagen aquí

Referencia: https://mp.weixin.qq.com/s?src=11×tamp=1615380866&ver=2938&signature=8Vq t71mnf4s4sH4mKnIY-H ** bGOVfI5t O7wE6tHrY50itCrUPivDcnawzzDzXyKXPXMXMXPXMXMXBXM

Supongo que te gusta

Origin blog.csdn.net/weixin_44414948/article/details/114647010
Recomendado
Clasificación