树形结构是一类非常重要的非线性数据结构,其中树和二叉树最为常用。
二叉树的特点是每个节点至多只有两棵子树,且二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树的性质:
性质 1. 在二叉树的第层上至多有
个结点
。
性质 2. 深度为的二叉树至多有
个结点,
。
性质 3. 对任何一个二叉树,如果其终端结点数为
,度为2的结点数为
,则
。
一棵深度为且有
个结点的二叉树称为满二叉树。深度为
的,有
个结点的二叉树,当且仅当其每一个结点都与深度为
的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。
完全二叉树的特点:(1)叶子结点只可能在层次最大的两层上出现;(2)对任一结点,若其右分支下的子孙的最大层次为,则其左分支下的子孙的最大层次必为
或
。
性质 4. 具有个结点的完全二叉树的深度为
。
二叉树的实现
class Node:
def __init__(self,data):
self.data = data
self.lchild = None
self.rchild = None
class BinaryTree:
def __init__(self):
self.root = None
# 创建二叉树
def CreatBiTree(self,node):
self.root = node
# 销毁二叉树
def DestroyBiTree(self):
self.root = None
# 清空二叉树
def ClearBiTree(self):
self.root.lchild = None
self.root.rchild = None
# 判断二叉树是否为空
def BiTreeEmpty(self):
if self.root == None:
return False
return True
# 先序遍历二叉树
def PreOrderTraverse(self,root):
self.root = root
if self.root == None:
return False
if root:
print('{} -> '.format(root.data),end = '')
self.PreOrderTraverse(root.lchild)
self.PreOrderTraverse(root.rchild)
# 中序遍历二叉树
def InOrderTraverse(self,root):
if root:
self.InOrderTraverse(root.lchild)
print('{} -> '.format(root.data), end='')
self.InOrderTraverse(root.rchild)
# 后序遍历二叉树
def PostOrderTraverse(self,root):
if root:
self.PostOrderTraverse(root.lchild)
self.PostOrderTraverse(root.rchild)
print('{} -> '.format(root.data), end='')
# 层序遍历二叉树
def LevelOrderTraverse(self):
pass