数据结构第六章——树和二叉树

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值