定义
满二叉树:
在一棵二叉树中,若所有分支结点都有左子树和右子树,并且所有的叶子结点只在最大层次出现,这样的二叉树称为满二叉树。深度为h的二叉树,若其结点数为$2^{h}-1$,则该二叉树为满二叉树。
完全二叉树:
对于一棵深度为k的二叉树,如果树中每一个结点都与深度为k的满二叉树中的同一位置有相同的编号,该二叉树就是完全二叉树,完全二叉树的叶子结点集中在最下面两层,对于任一结点,若其右子树的深度为h,则其左子树的深度为h或h+1。
二叉树的存储
顺序存储:
从二叉树的根结点开始,按照层次从小到大、同一层从左到右,将所有结点依次存储在一组地址连续的存储单元中。
如果是完全二叉树,则从根结点开始,按照层次从小到大、同一层从左到右的顺序对结点编号后存入数组中,即编号为i的结点存在数组下标为i-1的分量中。
按照以下规则可以求出双亲结点、左孩子、右孩子在数组中的下标(数组下标从0开始,二叉树编号从1开始):
- 对完全二叉树中任一编号为i的结点,如果2i > n,则编号i是叶子结点,否则2i为编号为i结点的左孩子;如果2i+1>n,则编号i无右孩子,否则2i+1为编号为i节点的右孩子。
- 对完全二叉树中任一编号为i的结点,如果i= 1,则i为根结点,无双亲,否则编号为i的结点的双亲为[i / 2](其中[i / 2]为不大于i / 2的最大整数)。
如果是非完全二叉树,则需要补位,也就是说补成完全二叉树,这样会浪费存储空间。
所以该方法并不适合非完全二叉树。
链式存储:
链式存储的每个结点包括结点值data、左孩子(leftchild)和右孩子(rightchild),也被称为二叉链表。
python表示:
class LinkedBinaryTreeNode(object):
def __init__(self):
self.data = "#"
self.LeftChild = None
self.RightChild = None
二叉链表访问双亲较为困难,所以可以再加一个parent域,用于存放双亲结点,也被称为三叉链表。
二叉树的建立及遍历
'''队列'''
class CircularSequenceQueue():
def __init__(self):
self.MaxQueueSize = 10
self.s = [None for x in range(0,self.MaxQueueSize)]
self.front = 0
self.rear = 0
'''当前队列是否为空'''
def IsEmptyQueue(self):
if self.front == self.rear:
iQueue = True
else:
iQueue = False
return iQueue
'''元素进队'''
def EnQueue(self,x):
if (self.rear+1)% self.MaxQueueSize != self.front:
self.rear = (self.rear+1)% self.MaxQueueSize
self.s[self.rear] = x
else:
print(<