一种层次数据结构:很多时候在管理上比线性表更为高效。
1.树的定义:由有限个节点以树的连接方式的集合:有一个唯一的根节点,若干个子树,其中每一个子树也有唯一的根节点,这个根节点下又分为若干的子树的递归定义
2. 有关树的基本术语:
节点的度 树的度 根节点 叶节点 分支节点 父节点 子节点 兄弟节点 子孙节点 祖先节点 节点的层次(根节点层次是1) 路径 路径长度 树的深度
3. 二叉树的定义:由根节点和左右子树构成,左右子树分别又是一个二叉树的递归定义
4.完美二叉树(满二叉树):
定义一(国外):一个二叉树中除了叶节点;其余节点的度数均为2
定义二(国内):在定义一的基础上,最后一层都布满了叶子节点,称为满二叉树
5. 完全二叉树:在满二叉树的基础上,可以连续删除掉最末尾几个元素
![](https://i-blog.csdnimg.cn/blog_migrate/36d0fd585453e72c264665bb31a65aaa.png)
6. 二叉树的重要性质
① 二叉树的第i(i=1,2,3...)层最多有2^(i-1)个节点; 一个k层的二叉树的总节点不多于 2^(k)-1个。
② n0=n2+1 :度数为0的节点是度数为2的节点的数量+1
7.二叉树的两种实现方式
1.利用 [ ] 来实现
''' 本模块不是封闭的模块;所以不可以被别的模块调用
这里提供几个本模块的接口'''
# 二叉树实例,作为输入
btree = ['A', ['B', None, None],
['C', ['D', ['F', None, None],
['G', None, None]]]]
#####################
def bintree(data, left=None, right=None): # 为了操作二叉树定义递归的基本框架
return [data, left, right]
def is_empty(btree):
return btree is None
def root(tree):
return tree[0]
def left(tree):
return tree[1]
def right(tree):
return tree[2]
def set_root(tree, data):
tree[0] = data
def set_left(tree, left):
tree[1] = left
def set_right(tree, right):
tree[2] = right
##########################
# 这里是实例操作的示例:
# 1 判断二叉树是否空:
ans=is_empty(btree)
print("这个二叉树是否空",ans)
# 2 找到这个二叉树的根
ans = root(btree)
print("这个二叉树的根是", ans)
# 3 把这个二叉树的右子树设置成为别的子树
print("设置了右子树之前", btree)
set_right(btree, bintree(100, bintree(200), 300))
print("设置了右子树之后", btree)
2. 以连接节点为基础构成的二叉树
'''基于链表节点的二叉树类实现
注意:这里的节点是封闭的但是,相关树的操作不是
封闭的
该模块提供的接口有:
1. 查看树的节点个数
2.如果全部节点内容是数值,可以求所有节点数值的和
'''
# 节点类
class BinTree:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
# 操作函数
def count_Note(btree):
if btree == None:
return 0
else: # 递归求解
return 1 + count_Note(btree.left)\
+ count_Note(btree.right)
def sum_Note(btree):
if btree==None:
return 0
else:
return btree.data+sum_Note(btree.left)\
+sum_Note(btree.right)
############################
# 操作示例
# 这里一定要注意的是:最小单元不可以是单个数字
#btree=BinTree(1,BinTree(2,3),BinTree(5,BinTree(6,9)))
btree=BinTree(1, BinTree(2, BinTree(3)), BinTree(5, BinTree(6, BinTree(9))))
print("节点的个数是:%d"%count_Note(btree))
print("节点的内容和是:%d"%sum_Note(btree))