1.树不是线性结构,是非线性的。
2.树在计算机科学里应用广泛,包括操作系统,图形学,数据库和计算机网络等。
3.数的术语:
·节点
· 树中的每一个元素称为一个节点,节点是树的基本组成部分。
· 边
· 边也是树的基本构成部分,边有方向,连接两节节点,并表示他们之间的联系。
· 除了根节点外每个节点都有且有一条与其他节点相连的入边,每个节点有多个出边
· 根节点
· 根节点是树中唯一一个没有入边的节点
4.树的定义:
树是节点和连接节点的边的集合,它有以下特征:
·有一个根节点
·除了根节点,每一个节点都有一条边与父节点相连
·可以沿着唯一的路径从根节点到每个节点
·如果这个树的每个节点都有至多两个子节点,称为二叉树
5.二叉树的定义:
· 二叉树是由n(n>=0)个节点组成的有限集合,每个节点最多有两个子树,它或者是空集,或者是由一个根和左右的两个不相交的二叉树组成
· 节点的度和树的度
· 每个节点具有的子树个数叫节点的度,所有节点的度的最大值称为树的度
· 二叉树的度为2
6.二叉树的特点:
· 二叉树是有序树,即使只有一个子树,也必须区分左右子树
· 二叉树的每个节点的度不能大于2
· 二叉树中所有节点的形态有5种:空节点,无左右子树的节点,只有左子树的节点,只有右子树,左右子树都有
7.满二叉树是完全二叉树的特例
8.二叉树的遍历:
· 按照一定次序访问树中所有节点,并且每个节点的值仅被访问一次的过程
· 可能的三种遍历次序:
· 先序遍历: VLR
· 中序遍历: LVR
· 后序遍历: LRV
9.列表实现二叉树的遍历:
mytree = [
'a',
['b',
['d',[],[]],
['e',[],[]],
],
['c',
['f',[],[]],
[],
]
]
print('root=',mytree[0])
print('left tree=',mytree[1])
print('right tree=',mytree[2])
结果:
root= a
left tree= ['b', ['d', [], []], ['e', [], []]]
right tree= ['c', ['f', [], []], []]
10.构建二叉树代码实现:
def bin_tree(r):
return [r,[],[]]
def insert_left(root,new_brach):
t = root.pop(1)
if len(t) > 1:
root.insert(1,[new_brach,t,[]])
else:
root.insert(1,[new_brach,[],[]])
return root
def insert_right(root,new_brach):
t = root.pop(2)
if len(t) > 1:
root.insrt(2,[new_brach,[],t])
else:
root.insert(2,[new_brach,[],[]])
return root
def get_root(root):
return root[0]
def set_root(root,new_root):
root[0] = new_root
def get_left_tree(root):
return root[1]
def get_right_left(root):
return root[2]
tree = bin_tree('a')
insert_left(tree,'b')
insert_right(tree,'c')
insert_left(get_left_tree(tree),'d')
insert_right(get_left_tree(tree),'e')
insert_left(get_right_left(tree),'f')
print(tree)
结果:
['a', ['b', ['d', [], []], ['e', [], []]], ['c', ['f', [], []], []]]
11.二叉树的先序遍历
def func_vlr(tree):
if tree != []:
print(tree[0],end='')
func_vlr(tree[1])
func_vlr(tree[2])
func_vlr(tree)
12.二叉树的中序遍历
def func_lvr(tree):
if tree != []:
func_lvr(tree[1])
print(tree[0],end='')
func_lvr(tree[2])
func_lvr(tree)
13.计算二叉树节点的个数
def count_func(tree):
if tree == []:
return 0
n1 = count_func(tree[1])
n2 = count_func(tree[2])
res = 1+n1+n2
return res
print(count_func(tree))
14.二叉排序树的定义:
· 要么是一颗空树
· 如果不为空,那么其左子树节点的值都小于根节点的值,右子节点的值都大于根节点的值
· 左右子树也是二叉排序树
15.判断二叉树中是否有某个数
def serach_tree(tree,num):
if tree == []:
return False
if num == tree[0]:
return True
elif num < tree[0]:
return serach_tree(tree[1],num)
elif num > tree[0]:
return serach_tree(tree[2],num)
16.二叉树插入一个数:
def insert_tree(tree,num):
if tree == []:
tree.extend([num,[],[]])
elif num <=tree[0]:
insert_tree(tree[1],num)
elif num > tree[0]:
insert_tree(tree[2],num)
17.查找二叉搜索树的最大值:
def getmax(tree):
if tree[2] ==[]:
x = tree[0]
if tree[1] != []:
tree[:] = tree[1]
else:
tree.clear()
return x
else:
return getmax(tree[2])
18.二叉搜索树删除一个数
def delete(tree,num):
if tree == []:
return False
if num < tree[0]:
return delete(tree[1],num)
elif num > tree[0]:
return delete(tree[2],num)
else:
if tree[1] == [] and tree[2] == []:
tree.clear()
elif tree[1] == []:
tree[:] = tree[2]
elif tree[2] == []
tree[:] = tree[1]
else:
max = getmax(tree[1])
tree[0] = max
return True