用Python实现二叉树,完全二叉树和满二叉树

⼆叉树的基本概念

⼆叉树是每个节点最多有两个⼦树的树结构。通常⼦树被称作“左⼦树”(left subtree)和“右⼦树”(right subtree)

⼆叉树的性质(特性)

  • 性质1: 在⼆叉树的第i层上⾄多有2^(i-1)个结点(i>0)
  • 性质2: 深度为k的⼆叉树⾄多有2^k - 1个结点(k>0)
  • 性质3:对于任意⼀棵⼆叉树,如果其叶结点数为N0,⽽度数为2的结点总 数为N2,则N0=N2+1;
  • 性质4:具有n个结点的完全⼆叉树的深度必为log2(n+1)
  • 性质5:对完全⼆叉树,若从上⾄下、从左⾄右编号,则编号为i 的结点,其左孩⼦编号必为2i,其右孩⼦编号必为2i+1;其双亲的编号必为i/2(i =1 时为根,除外)

完全二叉树
若设⼆叉树的⾼度为h,除第 h 层外,其它各层(1~h-1) 的结点数都达到最⼤个数,第h层有叶⼦结点,并且叶⼦结点都是从左到右依次排布,这就是完全⼆叉树。
在这里插入图片描述
满⼆叉树

除了叶结点外每⼀个结点都有左右⼦叶且叶⼦结点都处在最底层的⼆叉树
在这里插入图片描述
⼆叉树的节点表示以及树的创建

通过使⽤Node类中定义三个属性,分别为elem本身的值,还有lchild左孩⼦和rchild右孩⼦

class Node(object):
	"""节点类"""
	def __init__(self, elem=-1, lchild=None, rchild=None):
		self.elem = elem
		self.lchild = lchild
		self.rchild = rchild

树的创建,创建⼀个树的类,并给⼀个root根节点,⼀开始为空,随后添加
节点

class Tree(object):
	"""树类"""
	def __init__(self, root=None):
		self.root = root
	def add(self, elem):
	"""为树添加节点"""
		node = Node(elem)
		#如果树是空的,则对根节点赋值
		if self.root == None:
			self.root = node
    	else:
			queue = []
			queue.append(self.root)
			#对已有的节点进⾏层次遍历
			while queue:
			#弹出队列的第⼀个元素
				cur = queue.pop(0)
				if cur.lchild == None:
					cur.lchild = node
					return
				elif cur.rchild == None:
					cur.rchild = node
				    return
				else:
				#如果左右⼦树都不为空,加⼊队列继续判断
					queue.append(cur.lchild)
					queue.append(cur.rchild)
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python实现二叉树的示例代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class BinaryTree: def __init__(self): self.root = None def insert(self, val): if not self.root: self.root = TreeNode(val) else: self._insert(val, self.root) def _insert(self, val, node): if val < node.val: if node.left: self._insert(val, node.left) else: node.left = TreeNode(val) else: if node.right: self._insert(val, node.right) else: node.right = TreeNode(val) def inorder_traversal(self): res = [] self._inorder_traversal(self.root, res) return res def _inorder_traversal(self, node, res): if not node: return self._inorder_traversal(node.left, res) res.append(node.val) self._inorder_traversal(node.right, res) def preorder_traversal(self): res = [] self._preorder_traversal(self.root, res) return res def _preorder_traversal(self, node, res): if not node: return res.append(node.val) self._preorder_traversal(node.left, res) self._preorder_traversal(node.right, res) def postorder_traversal(self): res = [] self._postorder_traversal(self.root, res) return res def _postorder_traversal(self, node, res): if not node: return self._postorder_traversal(node.left, res) self._postorder_traversal(node.right, res) res.append(node.val) ``` 这个二叉树类包含了插入节点、中序遍历、前序遍历和后序遍历等方法。其中,插入节点方法使用递归实现,遍历方法使用了递归和栈两种方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值