树的基本概念
- 树的节点不能形成回路
- 森林是由多个数组成
树形结构的专有名词介绍
- 度数:每一个节点的所有子树的个数
- 层数:树的层数
- 高度:树的最大层数
- 树叶或终端节点:度数为零的节点
- 父节点:与这个节点有链接的上一层节点
- 子节点:每一个节点有链接的下一个节点
- 祖先和子孙: 祖先:从树根到该节点路劲上所包含的节点;子孙:该节点往下追溯的任一节点
- 兄弟节点: 有共同父节点的节点为兄弟节点
- 非终端节点:树叶以外的节点
- 同代:在同一棵树中具有相同层数的节点
二叉树
计算机存储树形结构一般是链表形式为主的。
定义:
* 二叉树最多只有两个子节点,每一个节点的度数小于等于2.
二叉树的特点:
- 树不可以为空集
- 树的度数为d>= 0 ,但二叉树的节点的度数
- 树的子树没有次序,二叉树有。左子树,右子树
- 高度为k的二叉树的总结点树是$ 2^{k}-1$
- 对于任意非空的二叉树T,如果 为树叶节点,且度数为2的节点数是 ,
- 在二叉树中,层数(Level)为i的节点数最多是
特殊的二叉树
满二叉树
- 对于二叉树的高度为h,树的节点数为$ 2^{n} - 1$
完全二叉树
- 如果二叉树的高度为h,树的节点数小于$ 2^{n} - 1$,编号方式与满二叉树相同,从上到下,从左到右。
斜二叉树
- 一个二叉树完全没有左节点或者右节点
严格二叉树
- 二叉树的每一个非终端节点都有左右子树。
二叉树的存储方式
一维数组表示法
- 左子树的索引值是父节点的索引值
- 右子树的索引值是父节点的索引值
二叉查找树
- 每一个树根的值需要大于左子树的值
- 每一个树根的值需要小于右子树的值
- 左右子树也是二叉查找树
- 树的每一个节点的值都不相同
建立一个二叉查找树
def Btree_create(btree,data,length):
for i in range(length):
level = 0
while btree[level] != None:
if data[i] > btree[level]:
level = level * 2+2
else:
level = level = level*2+1
btree[level] = data[i]
length = 8
data = [6,3,5,4,7,8,9,2]
btree = [None]*15
print('原始数组内容')
for i in range(length):
print('[%2d]' % data[i],end = ' ')
print(' ')
Btree_create(btree,data,8)
print('二叉树内容:')
for i in range(15):
print('[{}]'.format(btree[i]),end = ' ')
print()
原始数组内容
[ 6] [ 3] [ 5] [ 4] [ 7] [ 8] [ 9] [ 2]
二叉树内容:
[6] [3] [7] [2] [5] [None] [8] [None] [None] [4] [None] [None] [None] [None] [9]
二叉树的链表表示方法
#节点类
class tree:
def __init__(self):
self.data = 0
self.left = None
self.right = None
#以链表的方式建立二叉树
def create_tree(root,val):
newnode = tree()
newnode.data = val
newnode.left = None
newnode.right = None
if root == None:
root = newnode
return root
else:
current = root
while current != None:
backup = current
if current.data > val
current = current.left
else:
current = current.right
if backup.data > val:
backup.left = newnode
else:
backup.right = newnode
return root
按照顺序输入一个二叉树有十个节点,分别是[5,6,24,8,12,3,17,1,9]
class tree:
def __init__(self):
self.data = 0
self.left = None
self.right = None
def create_tree(root,val):
newnode = tree()
newnode.data = val
newnode.left = None
newnode.right = None
if root == None:
root = newnode
return root
else:
current = root
while current != None:
backup = current
if current.data > val:
current = current.left
else:
current = current.right
if backup.data > val:
backup.left = newnode
else:
backup.right = newnode
return root
data = [5,6,24,8,12,3,17,1,9]
ptr = None
root = None
for i in range(9):
ptr = create_tree(ptr,data[i])
print('左子树')
root = ptr.left
while root != None:
print('%d' % root.data)
root = root.left
print('--------------------------------------')
print('右子树')
root = ptr.right
while root != None:
print('%d' % root.data)
root = root.right
print()
左子树
3
1
--------------------------------------
右子树
6
24