python算法与数据结构013--二叉树的实现及按先序,后序,中序遍历的递归实现

本文深入探讨了二叉树的深度优先遍历(包括先序、中序、后序)和广度优先遍历的方法,通过递归和非递归方式实现,并提供了详细的代码示例。

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

二叉树的深度优先遍历: (可以用递归或者堆栈实现)

  • 先序:根节点->左子树->右子树
  • 中序: 左子树->根节点->右子树
  • 后序:左子树->右子树->根节点

二叉树按广度优先遍历:从上到下,从左到右遍历按层次遍历(利用队列实现)

class Node(object):
    """树的节点类"""
    def __init__(self,data=0,leftChild=None,rightChild=None):
        self.data=data
        self.leftChild=leftChild
        self.rightChild=rightChild

    def __repr__(self):
        return str(self.data)

class Tree(object):
    """无序二叉树的实现类"""
    def __init__(self):
        self.root=None

    def add(self,data):
        """向树中添加一个子节点"""
        node = Node(data)
        if not self.root:
            self.root=node
        else:
            #树不为空,需要遍历整棵树,找到节点的位置
            queue=[self.root]
            while queue:
                currentNode = queue[0]
                #先查找左子树,若左子树为空则加到左节点
                if currentNode.leftChild:
                    queue.append(currentNode.leftChild)
                else:
                    currentNode.leftChild = node
                    #print("currentNode is:" + str(currentNode.data) + " add [" + str(node.data) + "] to left")
                    break
                #再查找右子树,若右子树为空则添加到右节点
                if currentNode.rightChild:
                    queue.append(currentNode.rightChild)
                else:
                    currentNode.rightChild = node
                    #print("currentNode is:" + str(currentNode.data) + " add [" + str(node.data) + "] to right")
                    break
                #左右都不为空,将当前元素弹出继续往后遍历查找
                queue.pop(0)

    def preOrder(self,node,dataList):
        """先序遍历的递归实现: 根节点->左节点->右节点"""
        if node==None:
            return
        else:
            dataList.append(node.data)
            self.preOrder(node.leftChild,dataList)
            self.preOrder(node.rightChild,dataList)

    def inOrder(self,node,dataList):
        """中序遍历的递归实现:左节点->根节点->右节点"""
        if node == None:
            return
        else:
            self.inOrder(node.leftChild,dataList)
            dataList.append(node.data)
            self.inOrder(node.rightChild,dataList)

    def postOrder(self,node,dataList):
        """后序遍历的递归实现:左节点->右节点->根节点"""
        if node == None:
            return
        else:
            self.postOrder(node.leftChild,dataList)
            self.postOrder(node.rightChild, dataList)
            dataList.append(node.data)

    def breadthTravle(self):
        """按广度优先遍历"""
        if not self.root:
            print("这是一棵空树")
        else:
            queue =[self.root]
            index = 0
            while index < len(queue):
                currentNode = queue[index]
                if currentNode.leftChild:
                    queue.append(currentNode.leftChild)
                if currentNode.rightChild:
                    queue.append(currentNode.rightChild)
                index+=1

            #打印节点元素的值
            print("按广度优先遍历的结果:" + str(queue))

if __name__=='__main__':
    test = Tree()
    test.add(0)
    test.add(1)
    test.add(2)
    test.add(3)
    test.add(4)
    test.add(5)
    test.add(6)
    test.add(7)
    test.add(8)
    test.add(9)
    test.breadthTravle()
    listData = []
    test.preOrder(test.root,listData)
    print("先序遍历结果:" + str(listData))
    listData.clear()
    test.inOrder(test.root,listData)
    print("中序遍历的结果:" + str(listData))
    listData.clear()
    test.postOrder(test.root,listData)
    print("后序遍历的结果:" + str(listData))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值