二叉树及其Python实现

本文介绍了二叉树的概念及其在数据结构中的重要性,提供了二叉树的Python实现,包括二叉树节点的定义、插入节点的方法,以及先序遍历和层次遍历的算法。通过示例展示了如何创建和遍历一棵二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、二叉树

 二叉树是树结构中一种比较简单的结构,存储效率高,操作算法相对简单,且任何树都很容易转化成二叉树结构,因此二叉树在树结构中起着非常重要的作用。下面两个图所示就是二叉树,其中图(a)是一棵非完全二叉树,图(b)是一棵完全二叉树。二叉树在使用之前要首先被建立,在使用的过程中主要涉及到在树上查找节点,也就是二叉树的遍历。

本文主要给出了二叉树的建立、先序遍历和层次遍历的python实现,并给出了图(a)所示二叉树的建立和遍历结果。

uploading.4e448015.gif转存失败重新上传取消         uploading.4e448015.gif转存失败重新上传取消

  1.                                  (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()

 

参考文献

  1. 严蔚敏,吴伟民 .数据结构(C语言版)[M].北京:清华大学出版社,2013.4.

作者:YangYF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值