二叉树的创建,添加元素,广度遍历,深度遍历

1.创建树,添加元素的时候,利用add(),利用队列的思想存储数据和添加数据(队列并不是二叉树,只是一种对二叉树数据访问的一种方式)
2.遍历二叉树,利用递归思想

"""
@desc:
二叉树的实现,类似于队列取值和增加值:
从二叉树中取值,观察是否存在左子树,如果存在,尾部添加左子树,进行后续分析;不存在将左子树指向新节点;
观察是否存在右子树,如果存在,尾部添加右子树,进行后续分析,不存在将右子树指向新节点
"""
"""定义新节点:存在元素存储区,左子后继节点,右子后继节点"""
class Node():
    def __init__(self,item):
        self.elem=item
        self.lchil=None
        self.rchil=None
"""创建一个二叉树,队列存储结构"""
class Tree():
    """创建一个根节点的属性"""
    def __init__(self):
        self.root=None
    def add(self,item):
        queue=[self.root]
        #print("新添加元素后,根节点是{0}".format(self.root))
        node=Node(item)

        """将根节点传入队列中,如果根节点是None,队列也不是空列表,所以严谨性判断,否则进行到下面循环会出现报错"""
        if self.root is None:
            self.root=node
            return
        """从队列中读取一个元素,为cur_node,进行左子节点和右子节点分析"""
        "弹元素,进行左子节点和右子节点的分析,添加元素的循环终点是队列是空列表"
        while queue:
            cur_node=queue.pop(0)
            if cur_node.lchil is None:
                """如果左子节点是空值,直接将左子节点指向新节点,否则还需将左子节点指向的元素添加到队列中进行后续分析"""
                cur_node.lchil=node
                return #本次二叉树的目的就是添加新节点,一旦添加完毕,就进行返回,不在进行右子节点的分析
            else:
                queue.append(cur_node.lchil)
            if cur_node.rchil is None:
                """如果右子节点是空值,直接将右子节点指向新的节点,否则还需将右子节点指向的元素添加到队列中进行后续分析"""
                cur_node.rchil=node
                return#同左子节点
            else:
                queue.append(cur_node.rchil)
        print(queue)
    def breadth_travel(self):
        """需要进行广度遍历,一层一层的遍历,左子节点和右子节点"""
        queue=[self.root]
        if self.root is None:
            return
        while queue:#循环结束的终止条件是队列为空,则遍历结束
            cur_node=queue.pop(0)
            """打印出当前节点的元素值"""
            print(cur_node.elem,end="")
            if cur_node.lchil is not None:
                """如果左子节点存在的时候,需要将左子节点指向元素添加到队列中"""
                queue.append(cur_node.lchil)

            if cur_node.rchil is not None:
                queue.append(cur_node.rchil)
    def preorder(self,node):
        """进行先序遍历:根-左-右,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
        if node is None:#递归结束的终止条件是没有节点可以遍历
            return
        print(node.elem,end="")
        """递归遍历左子树,打印出左子节点的根节点"""
        self.preorder(node.lchil)
        """递归遍历右子树,打印出右子节点的根节点"""
        self.preorder(node.rchil)
    def inorder(self,node):
        """进行中序遍历:左-根-右,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
        if node is None:#递归结束的终止条件是没有节点可以遍历
            return
        """递归遍历左子树,打印出左子节点的根节点"""
        self.inorder(node.lchil)
        print(node.elem,end="")
        """递归遍历右子树,打印出右子节点的根节点"""
        self.inorder(node.rchil)
    def postorder(self,node):
        """进行后序遍历:左-右-根,调用该遍历方法的时候先传入根节点,表示根节点是什么"""
        if node is None:#递归结束的终止条件是没有节点可以遍历
            return
        """递归遍历左子树,打印出左子节点的根节点"""
        self.postorder(node.lchil)
        """递归遍历右子树,打印出右子节点的根节点"""
        self.postorder(node.rchil)
        print(node.elem, end="")


if __name__ =="__main__":
    tree=Tree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.add(9)
    print("进行广度遍历")
    tree.breadth_travel()
    print()
    print("进行前序遍历")
    tree.postorder(tree.root)
    print()
    print("进行中序遍历")
    tree.inorder(tree.root)
    print()
    print("进行后序遍历")
    tree.postorder(tree.root)



#########输出结果
进行广度遍历
0123456789
进行前序遍历
7839415620
进行中序遍历
7381940526
进行后序遍历
7839415620
Process finished with exit code 0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树深度遍历广度遍历是常用的遍历算法。 深度遍历是指对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。深度遍历可以细分为先序遍历、中序遍历和后序遍历。先序遍历是先访问根节点,然后递归地先序遍历左子树,再递归地先序遍历右子树。中序遍历是先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。后序遍历是先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。\[2\] 广度遍历是按层次遍历二叉树,先访问根节点,然后依次访问每一层的节点。广度遍历可以通过使用队列来实现。首先将根节点入队,然后循环执行以下步骤:出队一个节点,访问该节点,将该节点的左右子节点入队。直到队列为空。\[1\] 所以,二叉树深度遍历广度遍历是不同的遍历方式,深度遍历是递归地探索子树,而广度遍历是按层次遍历节点。这两种遍历方式在不同的场景下有不同的应用。 #### 引用[.reference_title] - *1* [二叉树深度遍历广度遍历](https://blog.csdn.net/weixin_37901561/article/details/105499250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [二叉树(一):深度优先遍历广度优先遍历](https://blog.csdn.net/Mike_honor/article/details/125828311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值