这篇博客介绍二叉树,包括二叉树的基本概念、二叉树的性质以及Python的实现。
我们先来看看什么是二叉树?
二叉树的基本概念
二叉树是每个节点最多有两个子树的结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)
如图所示是一个二叉树。
二叉树的性质
性质1:在二叉树的第
i
i
i层上至多有
2
i
−
1
2^{i-1}
2i−1个节点
(
i
>
0
)
(i>0)
(i>0)
性质2:深度为
k
k
k的二叉树至多有
2
k
−
1
2^k-1
2k−1个节点
(
k
>
0
)
(k>0)
(k>0)
性质3:对于任意一棵二叉树,如果其叶节点数为
N
0
N_0
N0,而度数为2的节点总数为
N
1
N_1
N1,则
N
0
=
N
2
+
1
N_0 = N_2 + 1
N0=N2+1
性质4:具有
n
n
n个节点的完全二叉树的深度必为
l
o
g
2
(
n
+
1
)
log2(n+1)
log2(n+1)
性质5:对完全二叉树,若从上至下、从左至右编号,则编号为
i
i
i的节点,其左孩子编号必为
2
i
2i
2i,其右孩子编号必为
2
i
+
1
2i+1
2i+1;其双亲的编号必为
i
/
2
i/2
i/2 (
i
=
1
i=1
i=1时为根,除外)
完全二叉树 —— 若设二叉树的高度为 h h h,除第 h h h层外,其他各层(1~h-1)的节点数都达到最大个数,第 h h h层有叶子节点,并且叶子节点都是从左到右依次排布,这就是完全二叉树。
满二叉树—— 除了叶节点外每一个节点都有左右子叶并且叶子节点都处在最底层的二叉树。
二叉树的节点表示以及树的创建
通过使用Node类中定义三个属性,分别为elem本身的值,还有lchild左孩子和rchild右孩子。
class Node(object):
'''节点类'''
def __init__(self, elem = -1, lchild = None, rchild = None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
树的创建,创建一个树的类,并给一个root根节点,一开始为空,随后添加节点。
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)