6.1 树
树的定义
树的性质
性质1: 树中的结点数等于所有结点的度数加1。
性质2:度为m的树中第i层上至多有mi-1个结点,这里应有i≥1。
性质3: 高度为h的m次树至多有 ____ 个结点。
性质4:具有n个结点的m次树的最小高度为 logm(n(m-1)+1)
树的基本运算
6.2 二 叉 树
满二叉树和完全二叉树
满二叉树
完全二叉树
二叉树性质
性质1 非空二叉树上叶结点数等于双分支结点数加1。即n0=n2+1。
性质2 非空二叉树上第i层上至多有2i-1个结点,这里应有i≥1。 由树的性质2可推出。
性质3 高度为h的二叉树至多有2h-1个结点(h≥1)。 由树的性质3可推出。
性质4 完全二叉树(结点个数为n)层序编号后的性质。
性质5 具有n个(n>0)结点的完全二叉树的高度为log2(n+1)或1+log2n
二叉树的链式存储结构
二叉链结点类BTNode
class BTNode: #二叉链中结点类
def __init__(self,d=None): #构造方法
self.data=d #结点值
self.lchild=None #左孩子指针
self.rchild=None #右孩子指针
建立各个结点
b=BTNode('A') #建立各个结点
p1=BTNode('B')
p2=BTNode('C')
p3=BTNode('D')
p4=BTNode('E')
p5=BTNode('F')
p6=BTNode('G')
b.lchild=p1 #建立结点之间的关系
b.rchild=p2
p1.lchild=p3
p3.rchild=p6
p2.lchild=p4
p2.rchild=p5
二叉树类设计
class BTree: #二叉树类
def __init__(self,d=None): #构造方法
self.b=None #根结点指针
#二叉树基本运算算法
设置二叉树的根结点SetRoot(b)
def SetRoot(self,r): #设置根结点为r
self.b=r
求二叉链的括号表示串DispBTree()
def DispBTree(self): #返回二叉链的括号表示串
return self._DispBTree(self.b)
def _DispBTree(self,t): #被DispBTree方法调用
if t==None: #空树返回空串
return ""
else:
bstr=t.data #输出根结点值
if t.lchild!=None or t.rchild!=None:
bstr+="(" #有孩子结点时输出"("
bstr+=self._DispBTree(t.lchild) #递归输出左子树
if t.rchild!=None:
bstr+="," #有右孩子结点时输出","
bstr+=self._DispBTree(t.rchild) #递归输出右子树
bstr+=")" #输出")"
return bstr
查找值为x的结点FindNode(x)
def FindNode(self,x): #查找值为x的结点算法
return self._FindNode(self.b,x)
def _FindNode(self,t,x): #被FindNode方法调用
if t==None:
return None #t为空时返回None
elif t.data==x:
return t #t所指结点值为x时返回t
else:
p=self._FindNode(t.lchild,x) #在左子树中查找
if p!=None:
return p #在左子树中找到p结点,返回p
else:
return self._FindNode(t.rchild,x) #返回在右子树中查找结果
求高度Height()
def Height(self): #求二叉树高度的算法
return self._Height(self.b)
def _Height(self,t): #被Height方法调用
if t==None:
return 0 #空树的高度为0
else:
lh=self._Height(t.lchild) #求左子树高度lchildh
rh=self._Height(t.rchild) #求右子树高度rchildh
return max(lh,rh)+1
6.3 二叉树先序、中序和后序遍历
先序遍历的递归算法
def PreOrder(bt): #先序遍历的递归算法
_PreOrder(bt.b)
def _PreOrder(t): #被PreOrder方法调用
if t!=None:
print(t.data,end=' ') #访问根结点
_PreOrder(t.lchild) #先序遍历左子树
_PreOrder(t.rchild) #先序遍历右子树
中序遍历的递归算法
def InOrder(bt): #中序遍历的递归算法
_InOrder(bt.b)
def _InOrder(t): #被InOrder方法调用
if t!=None:
_InOrder(t.lchild) #中序遍历左子树
print(t.data,end=' ') #访问根结点
_InOrder(t.rchild) #中序遍历右子树
后序遍历的递归算法
def PostOrder(bt): #后序遍历的递归算法
_PostOrder(bt.b)
def _PostOrder(t): #被PostOrder方法调用
if t!=None:
_PostOrder(t.lchild) #后序遍历左子树
_PostOrder(t.rchild) #后序遍历右子树
print(t.data,end=' ') #访问根结点
6.4 二叉树的层次遍历
from collections import deque #引用双端队列deque
def LevelOrder(bt): #层次遍历的算法
qu=deque() #将双端队列作为普通队列qu
qu.append(bt.b) #根结点进队
while len(qu)>0: #队不空循环
p=qu.popleft() #出队一个结点
print(p.data,end=' ') #访问p结点
if p.lchild!=None: #有左孩子时将其进队
qu.append(p.lchild)
if p.rchild!=None: #有右孩子时将其进队
qu.append(p.rchild)