二叉树的基本概念:
一个结点的层次直观上来说就是其所在的行,其中根结点层次为1(第一行),其子结点层次为2(第二行),以此类推
二叉树的深度(高度):指的是二叉树中的最大叶子结点所在的层。二叉树的深度=max(左子树深度,右子数深度)+1,可用递归的方式实现。
二叉树结点的度:指该结点分支的个数(0,1,2)
完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布
满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树
平衡二叉树(AVL):二叉排序树,空,或左子树和右子树都是平衡二叉树,且深度差<=1
性质:
(1) 在非空二叉树中,第i层的结点总数不超过, i>=1;
(2) 深度为h的二叉树最多有个结点(h>=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;度为1的结点数N1=N-N0-N2
(4) 具有n个结点的完全二叉树的深度为(注:[ ]表示向下取整)
(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
若I为结点编号(编号从1开始)则 如果I>1,则其父结点的编号为I/2;
如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;
如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。
(若编号从0开始,设l为父节点编号,则其左儿子的编号为2*l + 1, 其右儿子的编号为2*l + 2)
二叉树的创建与遍历:
# /usr/bin/pyhton
#coding=utf-8
#
#author:yumianzhan
class Tree_node():
def __init__(self, v = None, l = None, r = None):
self.value = v
self.left = l
self.right = r
#创建二叉树
def creat(root):
a = input('Inter a key:')
if a is '!':
print(a)
root = None
else:
root = Tree_node(v = a)
root.left = creat(root.left)
root.right = creat(root.right)
return root
#前序遍历
def preorder(root):
if root is None:
return
print(root.value)
preorder(root.left)
preorder(root.right)
#中序遍历
def inorder(root):
if root is None:
return
inorder(root.left)
print(root.value)
inorder(root.right)
#后序遍历
def postorder(root):
if root is None:
return
postorder(root.left)
postorder(root.right)
print(root.value)
#测试
def main():
root = None
root = creat(root)
print(root)
print('前序遍历:')
preorder(root)
print('中序遍历:')
inorder(root)
print('后序遍历:')
postorder(root)
if __name__ == '__main__':
main()
运行程序,建立二叉树如下:
前序遍历结果为: a b c d e f
中序遍历结果为:c b d a f e
后序遍历结果为:c d b f e a