Python之BST二叉查找树

本文介绍了BST(二叉查找树)的概念,强调在该数据结构中,左子节点的键值总是小于父节点,右子节点的键值总是大于父节点。同时指出在操作节点时需要注意调整其父、子节点的连接以保持树的正确性。
摘要由CSDN通过智能技术生成

BST搜索树:在一个二叉搜索树中,如果左子树中键值Key都小于父节点,而右子树中键值Key都大于父节点,我们将这种树称为BST搜索树。

注意:移动树的节点时,被移动节点及其原新两个位置的父、子节点的指向均需重新指向,保证各节点指向正确。

示例:

# 创建树的节点类
class TreeNode(object):
	# 初始化树的节点
	def __init__(self, key, val, left=None, right=None, parent=None):
		self.key = key 									#节点值,节点位置,索引
		self.payload = val 								#有效载荷,节点显示的值
		self.leftChild = left 							#左子节点
		self.rightChild = right 						#右子节点
		self.parent = parent 							#父节点

	# 判断是否有左子节点,若有则返回左子节点
	def hasLeftChild(self):
		return self.leftChild

	# 判断是否有右子节点,若有则返回右子节点
	def hasRightChild(self):
		return self.rightChild

	# 判断是否是左子节点(父节点存在,并且self与self父节点的左子节点相同)
	def isLeftChild(self):
		# 下面的含义是(self.parent is not None) and (self.parent.leftChild == self)
		return self.parent and self.parent.leftChild == self

	# 判断是否是右子节点
	def isRightChild(self):
		return self.parent and self.parent.rightChild == self

	# 判断是否是根节点
	def isRoot(self):
		return not self.parent	 						#没有父节点

	# 判断是否是叶节点
	def isLeaf(self):
		return not (self.rightChild or self.leftChild)	#没有左右子节点

	# 判断是否有子节点
	def hasAnyChildren(self):
		return self.rightChild or self.leftChild 		#有左或右子节点

	# 判断是否有2个子节点
	def hasBothChildren(self):
		return self.rightChild and self.leftChild 		#有左右2个子节点

	# 替换节点数据
	def replaceNodeData(self, key, value, lc, rc):
		self.key = key 									#更新节点值
		self.payload = value 							#更新有效载荷
		self.leftChild = lc 							#更新左子节点
		self.rightChild = rc 							#更新右子节点
		if self.hasLeftChild():							#若有左子节点
			self.leftChild.parent = self 				#将该节点的左子节点的父节点指向self
		if self.hasRightChild():						#若有右子节点
			self.rightChild.parent = self 				#将该节点的右子节点的父节点指向self

	# 中序遍历
	# 只要用了yield语句,普通函数就是生成器,也是迭代器,在定义过程中不需要像迭代器那样写__iter__()和__next__()方法。yield语句的作用就是在调用的时候返回相应的值和作为生成器的标志。
	def __iter__(self):
		if self:										#若当前节点存在,则
			if self.hasLeftChild():						#若当前节点有左子节点,则
				for elem in self.leftChild:				#循环输出当前节点的左子树的节点值
					yield elem 							#在for循环中,每次执行到yield时,就返回一个迭代值,且不会终止循环;下个循环时,代码从yield返回值的下
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值