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:
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:
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:
Paso 1: Inserte 8 como nodo raíz.
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.
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.
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.
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.
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.
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.
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.
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.
4. Resultados de recorrido de orden medio:
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