第十二章 二叉搜索树
文章目录
12、二叉搜索树
- 1、采用递归形式
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.p = None
"""递归版本"""
class Solution():
"""二叉树插入结点"""
# 方法一:两个函数,需定位父结点
def recursive_tree_insert(self, T, z):
if not T:
T = z
else:
self.insert(None, T, z)
def insert(self, p, x, z): # p是x结点的父结点
if not x:
z.p = p
if z.val < p.val:
p.left = z
else:
p.right = z
elif z.val < x.val:
self.insert(x, x.left, z)
else:
self.insert(x, x.right, z)
# 方法二:一个函数,两个if结构
def tree_insert(self, T, z):
if z.val > T.val and T.right != None:
self.tree_insert(T.right, z)
elif z.val < T.val and T.left != None:
self.tree_insert(T.left, z)
if T.left == None and z.val < T.val:
T.left = z
z.p = T
elif T.right == None and z.val > T.val:
T.right = z
z.p = T
"""二叉树移植结点"""
def transplant(self, root, u, v):
if u.p == None:
root = v
elif u == u.p.left:
u.p.left = v
else:
u.p.right = v
if v:
v.p = u.p
"""二叉树删除结点"""
def delete(self, root, z):
if z.left == None:
self.transplant(root, z, z.right)
elif z.right == None:
self.transplant(root, z, z.left)
else:
y = self.tree_minimum(z.right) # 找到右子的后继
if y.p != z:
self.