一、二叉树
二叉树是树结构中一种比较简单的结构,存储效率高,操作算法相对简单,且任何树都很容易转化成二叉树结构,因此二叉树在树结构中起着非常重要的作用。下面两个图所示就是二叉树,其中图(a)是一棵非完全二叉树,图(b)是一棵完全二叉树。二叉树在使用之前要首先被建立,在使用的过程中主要涉及到在树上查找节点,也就是二叉树的遍历。
本文主要给出了二叉树的建立、先序遍历和层次遍历的python实现,并给出了图(a)所示二叉树的建立和遍历结果。
- (b)
二叉树图示
二、二叉树的Python实现
#定义类MyTree,建立二叉树、先序遍历二叉树、层次遍历二叉树
#每个节点包括:节点数据、节点的双亲、左子树的根、右子树的根
class MyTree( object ):
#初始化二叉树的节点
def __init__( self, data ):
self.Data = data
self.Parent = None
self.LChild = None
self.RChild = None
#在二叉树上插入节点
def InsertNode( self, parentName = None, locFlag = 'L' , branch = [] ):
if parentName == None and locFlag == 'L':
if( self.LChild == None ):
self.LChild = MyTree( branch )
else:
s = self.LChild
q = MyTree( branch )
q.LChild = s
s.Parent = q
self.LChild = q
if parentName == None and locFlag == 'R':
if( self.RChild == None ):
self.RChild = MyTree( branch )
else:
s = self.RChild
q = MyTree( branch )
q.RChild = s
s.Parent = q
self.RChild = q
if parentName != None:
p = self
top = 0
stack = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
while( p!= None ):
if( p.Data == parentName ):
q = MyTree( branch )
if( locFlag == 'L' ):
if( p.LChild == None ):
p.LChild = q
q.Parent = p
else:
s = p.LChild
q.LChild = s
s.Parent = q
p.LChild = q
elif( locFlag == 'R' ):
if( p.RChild == None ):
p.RChild = q
q.Parent = p
else:
s = p.RChild
q.RChild = s
s.Parent = q
p.RChild = q
break
R = p.RChild
if( R != None ):
stack[top] = R
top = top + 1
p = p.LChild
if( (p == None) and (top > 0) ):
p = stack[ top-1 ]
top = top - 1
#先序遍历二叉树
def PreOrderTravelTree( self ):
stack = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
top = 0
p = self
if( p == None ):
print( 'the tree is empty.' )
return
while( p != None ):
print( '↓', p.Data )
R = p.RChild
if( R != None ):
stack[top] = R
top = top + 1
p = p.LChild
if( (p == None) and (top > 0) ):
p = stack[ top-1 ]
top = top - 1
#按层遍历二叉树
def LevelTravelTree( self ):
layer = 0
p = self
queue = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
front = 0
rear = 1
queue[rear] = p
level = rear
while( front < rear ):
front = front + 1
p = queue[ front ]
print( '↓', p.Data )
if( p.LChild != None ):
rear = rear + 1
queue[ rear ] = p.LChild
if( p.RChild != None ):
rear = rear + 1
queue[ rear ] = p.RChild
if( front == level ):
layer = layer + 1
level = rear
def main():
obj = MyTree( '1' )
obj.InsertNode( '1', 'L', '2' )
obj.InsertNode( '1', 'R', '3' )
obj.InsertNode( '2', 'L', '4' )
obj.InsertNode( '2', 'R', '5' )
obj.InsertNode( '5', 'L', '6' )
obj.InsertNode( '5', 'R', '7' )
print( 'PreOrder Traverse result:' )
obj.PreOrderTravelTree()
print()
print( 'LevelOrder Traverse result:' )
obj.LevelTravelTree()
if __name__ == '__main__':
main()
参考文献
- 严蔚敏,吴伟民 .数据结构(C语言版)[M].北京:清华大学出版社,2013.4.
作者:YangYF