二叉搜索树特点:(针对值)
左子树<根节点<右子树,并且子树也是二叉搜索树(递归)
其实就是建立一个约定俗成的数据结构去存数据,然后方便调用里面的数据。
约定俗称的一些代码表示方式:
①定义了一个名为TreeNode的类,用于表示二叉搜索树的节点。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val #表示当前节点的值
self.left = left #表示当前节点的左子树
self.right = right #表示当前节点的右子树
②创建一个二叉搜索树呢?
简单的例子:
# 创建根节点
root = TreeNode(6)
# 创建左子节点和右子节点
root.left = TreeNode(3)
root.right = TreeNode(9)
# 访问节点的值
print(root.val) # 输出:6
print(root.left.val) # 输出:3
print(root.right.val) # 输出:9
③创建一个二叉搜索树自我实现的类?
比如来了一个列表,怎么变成一个二叉树的形式
a.首先需要写 创建方式/插入的自定义函数:
递归思想,给定root根节点,来一个val就比大小,小放左,大放右。如果来了个很小的,会递归,
def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
if root == None:
return TreeNode(val)
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
if val > root.val:
root.right = self.insertIntoBST(root.right, val)
return root
b.第二,给nums 需要放入的值的列表
class Solution:
def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
if root == None:
return TreeNode(val)
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
if val > root.val:
root.right = self.insertIntoBST(root.right, val)
return root
def buildBST(self, nums) -> TreeNode:
root = TreeNode(val)
for num in nums:
self.insertIntoBST(root, num)
return root
④删除二叉搜索树中某个节点:
原则:删完依然保持二叉搜索树的特点:左<根<右
所以删掉某个节点,如果其左子树为空,右顶上;右子树为空,左才能顶上;左右都不空,左右和被删掉节点对应的兄弟节点就要比大小更新了。
class Solution:
def deleteNode(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return root
if root.val > val:
root.left = self.deleteNode(root.left, val)
return root
elif root.val < val:
root.right = self.deleteNode(root.right, val)
return root
else:
if not root.left:
return root.right
elif not root.right:
return root.left
else:
curr = root.right
while curr.left:
curr = curr.left
curr.left = root.left
return root.right