二叉树 --python描述

class Node:
	'''节点类:树是对链表的扩充,所以也有节点类'''
	def __init__(self,item):	#item是保存的数据
		self.elem = item
		self.lchild = None
		self.rchild = None

class Tree:
	'''二叉树'''
	def __init__(self):
		#根节点
		self.root  = None
	
	#添加节点:每一层找到的最后的位置,就是添加节点的位置
	def add(self,item):
		#构造出要添加的节点
		node = Node(item):
		#广度遍历添加,对节点的遍历和操作始终是左边(root,队头)取元素,右边(队尾)添加元素,联想到可以套用队列的思想
		#如果根节点也为空,直接将要添加的节点放到根节点位置
		if self.root is None:
			self.root = node
			return	#节点插入完,直接退出函数
		
		#有根节点的情况	
		#建立一个队列,用来取节点和添加节点
		#将根节点放到队列中,为接下来向后遍历做准备
		queue = [self.root]
		
		#给当前节点添加子节点:肯定是从根节点开始处理
		#从队列头取节点
		cur_node = queue.pop(0)
		
		#循环遍历队列:1.直到找到要添加节点的位置,2。若不为空则将子节点添加到队列中以便之后给他添加子节点
		#循环结束条件是队列被取出元素为空时
		while queue:	
			#如果当前节点左边的子节点是空,将构造出来的node挂到左边,然后退出
			if cur_node.lchild is None:
				cur_node.lchild = node
				return 
			#如果左子节点存在,准备对其进行添加子节点的操作,将左孩子添加到队列尾
			else:
				queue.append(cur_ndoe.lchild)
			
			#左子节点存在
			#查看右子节点情况并进行操作
			#如果右子节点为空,将当前节点的右子节点挂上去,并直接结束当前add函数
			if cur_node.rchild is None:
				cur_node.rchild = node
				return 
			#否则说明右子节点存在,将右子节点添加到队列中准备对其进行添加子节点操作
			else:
				queue.append(cur_node.rchild)

	#遍历:广度(层次)遍历,使用队列的思想
	def breadth_travle(self):
		#没根节点的情况
		if self.root is None:
			return 
		
		queue = [self.root]
		while queue:	#循环遍历,一直到队列中没有节点为止
			cur_node = queue.pop(0)
			print(cur_node.elem,end=' ') #打印出遍历到的元素
			#将cur_elem的子节点添加到队列中
			if cur_node.lchild is not None:
				queue.append(cur_node.lchild)
			if cur_node.rchild is not None:
				queue.append(cur_node.rchild)

	#遍历:深度遍历 -- 先序遍历:根-左-右
	#先输出所有树的根,再从左边最小的那颗树开始输出左和右
	#采用递归,每次遍历的时候root都在变,所以
	def preorder(self,node):
		#递归退出条件:传进来递归的节点是None(说明到头了)
		if node is None:
			return
		
		#流程:将当前元素打印出来
		     #遍历当前节点的左半部分
		     #遍历当前节点的右半部分
		print(root,elem,end=' ')
		self.preorder(node.lchild)
		self.preorder(node.rchild)

	#遍历:深度遍历 -- 中序遍历:左-根-右
	def inorder(self,node):
		if node is None:
			return
		self.inorder(node.lchild)
		print(node.elem,end=' ')
		self.inorder(node.rchild)
		
	#遍历:深度遍历 --后序遍历:左-右-根
	def postorder(self,node):
		if node is None:
			return 
		self.postorder(node.lchild)
		self.postorder(node.rchild)
		print(root,elem,end=' ')

if __name__ == '__main__':
	tree = Tree()	#实例化一颗树
	tree.add(0)	#这是根节点
	tree.add(1)	#添加节点
	tree.add(2)
	tree.add(3)
	tree.add(4)
	tree.add(5)
	tree.add(6)
	tree.add(7)
	tree.add(8)
	tree.add(9)
	
	#广度遍历
	tree.breadth_travel()	#遍历出来的结果就是1 2 3 4 5
	print(' ') 	#换行,因为print默认会换行
	#先序遍历,需要寻着树的根节点才能找到树,所以需要传入根节点
	tree.preorder(tree.root)	#0 1 3 7 8 4 9 2 5 6
	print(' ')
	#中序
	tree.inorder(tree.root) 	#7 3 8 1 9 4 0 5 2 6
	print(' ')
	#后序
	tree.postorder(tree.root) 	#7 8 3 9 4 1 5 6 2 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值