python 树的添加节点 广度和深度遍历

功能:给树添加结点
思想:用广度遍历去做
queue = [0]

广度优先,根节点是0的 ,0添加到队列里面
第一次取出0,判断有没有左和右,添加1和2
第二次取出1,添加3和4
第三次取出2,添加5和6
第四次取出3,添加7个8
第五次取出4,添加9

在这里插入图片描述

class Node:
        def __init__(self,elem):
                #结点数据
                self.elem= elem
                #左子树和右子树 
                self.lchild = None
                self.rchild = None


#二叉树的实现
class my_tree:
        #初始化空树
        def __init__(self):
                self.root = None

        #树添加元素,广度遍历+队列 
        def add(self,item):
                #创建一个新节点
                node = Node(item)
                #特殊情况,树没有节点 就添加节点
                if self.root is None:
                        self.root = node
                        return
                else:
                        #队列的方式实现 ,队列最开始存根
                        queue = [self.root]
                        #循环处理队列,直到将新结点添加进树为止
                        while queue:
                                #从头取 第一次取的是根节点
                                cur_node = queue.pop(0)
                                # 判断取出的节点有没有左或者右的值 左节点是空,则添加新结点
                                if cur_node.lchild is None:
                                        cur_node.lchild = node
                                        return
                                else:
                                        #左节点不是空,则将左节点添加队列 
                                        queue.append(cur_node.lchild)

                                if cur_node.rchild is None:
                                        cur_node.rchild = node
                                        return
                                else:
                                        queue.append((cur_node.rchild))


#广度遍历
        def tree_travle(self):
                if self.root is None:
                        return
                else:
                        #队列先存根节点
                        queue = [self.root]
                        while queue:
                                #从头取 第一次取的是根节点
                                cur_node = queue.pop(0)
                                print(cur_node.elem,end=' ')
                                #当前打印完的节点还有子节点     
                                if cur_node.lchild is not None:
                                        queue.append(cur_node.lchild)

                                if cur_node.rchild is not None:
                                        queue.append(cur_node.rchild)


#深度遍历  思想是递归 
#先序 根左右 
        def xian(self,root):
                if root == None:
                        return
                else:
                        print(root.elem,end=' ')
                        #递归
                        self.xian(root.lchild)
                        self.xian(root.rchild)


#中序 左根右
        def zhong(self,root):
                if root == None:
                        return

                else:
                        self.zhong(root.lchild)
                        print(root.elem,end=' ')
                        self.zhong(root.rchild)


#后序 左右根
        def hou(self,root):
                if root == None:
                        return

                else:
                        self.hou(root.lchild)
                        self.hou(root.rchild)
                        print(root.elem,end=' ')





if __name__ == '__main__':
        tree = my_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)
        tree.tree_travle()
         # 广度
        print('')
        # 先序
        tree.xian(tree.root)
        print('')
        # 中序
        tree.zhong(tree.root)
        print('')
        # 后序
        tree.hou(tree.root)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值