



【备注】上图符合完全二叉树

【备注】上图也符合完全二叉树,因为4的左边已经存在子树

【备注】上图就不是完全二叉树,因为6没有左子树;4和5下面没有子树

【备注】上图就不是完全二叉树,因为4下面没有子树,最后一层子树的顺序应该是4-5-6-7,不能直接在9下面添加子树

math.cell(log2(n+1)),不小于对数值的最小整数,向上取整【解析】高度为k的二叉树,如果只有一个路径(斜树),就是有k的结点,高度也只多为k;math.cell(log2(n+1))指的是取(n+1)的对数,然后向上取整
例如:如果结点是8,那么计算公式就为log2(8+1),因为log2(8)=3,所以log2(8+1)肯定大于3,向上取整就是4层
性质4具有n个结点的完全二叉树的深度为int(log2n)+1或者math.cell(log2(n+1))
【备注】int(log2n)指的是取n的对数,然后取整型,小数取整型时时直接去掉小数
性质5 有n个结点的完全二叉树(深度为性质4),结点按照层序编号(如下图),各个节点之间的关系如下:

1.如果i=1,则i结点是根结点,无双亲,
2.i>1,则其双亲时int(i/2),向下取整。就是子结点的编号整除2得到的度结点的编号。福结点如果时i,那么左侧的编号就是2i,右侧的编号就是2i+1
3.如果2i>n,则结点i无左侧树,即结点i为叶子结点,否则其左侧子结点的编号就是2i
4.如果2i+1>n,则结点i没有右结点,注意这里并不能说明i没有左结点,否则有结点的编号就是2i_1

class Node():
''' 树的节点'''
def __init__(self,item):
self.item = item # 树节点上的数据
'''树和链表不一样的地方在于:
树有两个后继节点,链表只有一个'''
self.l_next = None # 树的左节点指向
self.r_next = None # 树的右节点指向
class Tree_data():
''' 构造二叉树'''
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 queue:
# 判断节点的左子树或者右子树是否为空,如果不为空,将其追加到队列中
cur_node = queue.pop(0)# 当前拿到的节点
if cur_node.l_next is None:
cur_node.l_next = node
return
else:
queue.append(cur_node.l_next)
if cur_node.r_next is None:
cur_node.r_next = node
return
else:
queue.append(cur_node.r_next)
def breadth_travel(self):
'''广度优先遍历'''
if self.root is None:
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
print(cur_node.item)
if cur_node.l_next is not None:
queue.append(cur_node.l_next)
if cur_node.r_next is not None:
queue.append(cur_node.r_next)
if __name__ == '__main__':
t = Tree_data()
t.add(10)
t.add(1100)
t.add(1000)
t.add(80)
t.add(88)
t.breadth_travel()
*************************run_result***************
10
1100
1000
80
88




class Node():
''' 树的节点'''
def __init__(self,item):
self.item = item # 树节点上的数据
'''树和链表不一样的地方在于:
树有两个后继节点,链表只有一个'''
self.l_next = None # 树的左节点指向
self.r_next = None # 树的右节点指向
class Tree_data():
''' 构造二叉树'''
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 queue:
# 判断节点的左子树或者右子树是否为空,如果不为空,将其追加到队列中
cur_node = queue.pop(0)# 当前拿到的节点
if cur_node.l_next is None:
cur_node.l_next = node
return
else:
queue.append(cur_node.l_next)
if cur_node.r_next is None:
cur_node.r_next = node
return
else:
queue.append(cur_node.r_next)
def preorder(self,node):
'''
前序遍历 /先序遍历
:param root: 每次遍历子树的根节点
:return:
'''
# 退出递归的条件
if node == None:
return
print(node.item,end=" ") # 打印当前子树的根节点
self.preorder(node.l_next)# 递归根节点的左子树
self.preorder(node.r_next) # 递归根节点的右子树
def inorder(self,node):
'''
中序遍历
:param root: 每次遍历子树的根节点
:return:
'''
# 退出递归的条件
if node == None:
return
self.inorder(node.l_next) # 递归根节点的左子树
print(node.item,end=" ") # 打印当前子树的根节点
self.inorder(node.r_next) # 递归根节点的右子树
def aftorder(self, node):
'''
后序遍历
:param root: 每次遍历子树的根节点
:return:
'''
# 退出递归的条件
if node == None:
return
self.aftorder(node.l_next) # 递归根节点的左子树
self.aftorder(node.r_next) # 递归根节点的右子树
print(node.item, end=" ") # 打印当前子树的根节点
if __name__ == '__main__':
t = Tree_data()
t.add(0)
t.add(1)
t.add(2)
t.add(3)
t.add(4)
t.add(5)
t.add(6)
t.add(7)
t.add(8)
t.add(9)
t.preorder(t.root)
print(" ")
t.inorder(t.root)
print(" ")
t.aftorder(t.root)
*******************run_result***************
0 1 3 7 8 4 9 2 5 6
7 3 8 1 9 4 0 5 2 6
7 8 3 9 4 1 5 6 2 0

