一、二叉树性质
1).第i层的结点个数最多为个;
2).具有n个结点的完全二叉树的层数k为;
3).k层的二叉树最多结点个数为个;
4).如果叶子结点个数为p,度degree为2的结点个数为q,则有关系为p=q+1;
二、二叉树类型
三、遍历方式
1).深度优先遍历
包括先序遍历、中序遍历、后序遍历;一般采用递归的方式遍历;
先序遍历:根左右;
中序遍历:左根右;
后序遍历:左右根;
2).广度优先遍历
一般为层次遍历,即从上至下,从左至右的方式进行遍历,常采用队列的方式;
3).下图表达了遍历之后的结果即对比
唯一确定一条二叉树的方式:
先序遍历、中序遍历;
后序遍历、中序遍历;
四、编写代码
1).构建结点、树 类
import random
class Node(object): #结点类
def __init__(self,val=-1,lchild=None, rchild=None):
self.val = val
self.lchild = lchild
self.rchild = rchild
class tree(object):
def __init__(self, root=None):
self.root = root
def add(self,elem):
node = Node(elem)
#如果树是空的,则对根节点赋值
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
while queue:
# 弹出第一个元素
cur = queue.pop(0)
if cur.lchild == None:
cur.lchild = node
return
elif cur.rchild == None:
cur.rchild = node
return
else:
#如果左右子树都不为空,加入队列继续判断
queue.append(cur.lchild)
queue.append(cur.rchild)
# 建立一个二叉树two_tree
two_tree = tree()
wuxu_liebiao = random.sample(range(10),10)
for val in wuxu_liebiao:
two_tree.add(val)
2).先序遍历二叉树
res = []
def Preorder(root):
if root == None:
return
res.append(root.val)
prior(root.lchild)
prior(root.rchild)
Preorder(two_tree.root)
print(res)
3).中序遍历二叉树
res = []
def Middle(root):
if root == None:
return
prior(root.lchild)
res.append(root.val)
prior(root.rchild)
Middle(two_tree.root)
print(res)
4).后序遍历二叉树
res = []
def Postscript(root):
if root == None:
return
prior(root.lchild)
prior(root.rchild)
res.append(root.val)
Postscript(two_tree.root)
print(res)
5).层次遍历二叉树
def arrangement(root):
if root == None:
return
queue = [root]
res = []
while queue:
cur = queue.pop(0)
res.append(cur.val)
if cur.lchild != None:
queue.append(cur.lchild)
if cur.rchild != None:
queue.append(cur.rchild)
return res
result = arrangement(two_tree.root)
print(result)