二叉树定义
二叉树是每个节点最多有2个子节点的树结构(也可以为空集,称为空二叉树)
二叉树性质
1.在二叉树的第i层上最多有2^(i-1) 个节点 。(i>=1)
2.二叉树中如果深度为k,那么最多有2^k-1个节点。(k>=1)
几种二叉树
斜树
所有节点只有左节点的称为左斜书,所有节点只有右节点的被称为右斜树
二叉排序树
根结点的关键字大于左子树结点的关键字小于右子树结点的关键字
平衡二叉树
平衡二叉树是二叉排序树的改进版,目的是为了减少平均查找长度,建出最矮的树,提高查询速度。平衡二叉树需要满足以下两个点
平衡因子
完全二叉树
满二叉树
二叉树的代码实现
# 每个节点的模板class类
class Node:
def __init__(self,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)
# 假如根节点是空,新添加进来的这个节点对象挂在根节点上
if self.root is None:
self.root = node
return
# 通过层序遍历的方式挂新添加进来的节点
queue = [self.root]
while True:
# 每次从在队列里抛出一个节点
cur_node = queue.pop(0)
# 假如左节点没有,把新节点挂在左节点上
if cur_node.lchild is None:
cur_node.lchild = node
return
# 否则把左节点放进队列,等待遍历
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild = node
return
else:
queue.append(cur_node.rchild)
# 层序遍历(广度遍历)
def bianlitree(self):
if self.root == None:
return
# 先把根节点放进队列中
queue = [self.root]
while queue:
# 和add的方法逻辑类似,通过队列的方式进行遍历
cur_node = queue.pop(0)
print(cur_node.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)
# 先序遍历
def probianli(self,cur_node):
if cur_node == None:
return
# 打印当前节点,然后把左节点放进递归
print(cur_node.elem)
self.probianli(cur_node.lchild)
self.probianli(cur_node.rchild)
# 中序遍历
def midbianli(self, cur_node):
if cur_node == None:
return
# self.root = cur_node
self.midbianli(cur_node.lchild)
print(cur_node.elem)
self.midbianli(cur_node.rchild)
# 后序遍历
def backbianli(self, cur_node):
if cur_node == None:
return
# self.root = cur_node
self.backbianli(cur_node.lchild)
self.backbianli(cur_node.rchild)
print(cur_node.elem)
# 先实例化二叉树
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)
print(' 层序遍历')
tree.bianlitree()
print(' 先序遍历')
tree.probianli(tree.root)
print(' 中序遍历')
tree.midbianli(tree.root)
print(' 后序遍历')
tree.backbianli(tree.root)