通过python,实现二叉树广度和深度设计

# 二叉树设计
# 定义节点类
class Node:
    # 修改初始化方法
    def __init__(self,value):
        self.value = value  # 节点值
        self.left = None  # 左子树
        self.right = None  # 右子树
# 定二叉树类
class BinaryTree:
    # 修改初始化方法
    def __init__(self,root=None):
        self.root = root # 根节点
    # 定义添加节点方法 广度优先
    def add(self,value):
        if self.root == None:
            self.root = Node(value)
            return # 根节点已存在,不再添加
        # 根节点不为空,开始遍历
        queue= []
        # 将根节点加入队列
        queue.append(self.root)
        # 循环判断,哪个节点为空,将新节点加入该节点
        while True:
           # 从队列中取出根节点
            node = queue.pop(0)
           # 判断该节点左子树是否为空
            if node.left == None:
                node.left = Node(value)
                return
            else:
                queue.append(node.left)
            # 判断该节点右子树是否为空
            if node.right == None:
                node.right = Node(value)
                return
            else:
                queue.append(node.right)
    # 遍历二叉树 广度优先
    def traverse(self,root):
        # 判断根节点是否为空,若为空,则返回
        if self.root == None:
            return
        # 创建队列
        queue = []
        # 将根节点添加到队列中
        queue.append(self.root)
        # 循环遍历,根据队列长度来循环,需要大于0
        while len(queue) > 0:
            # 从队列中取出节点
            node = queue.pop(0)
            # 打印节点内容
            print(node.value,end=' ')
            # 判断左子树是否为空,若不为空,则添加到队列中
            if node.left != None:
                queue.append(node.left)
            # 判断右子树是否为空,若不为空,则添加队列中
            if node.right != None:
                queue.append(node.right)
    # 遍历二叉树,深度优先,先序遍历 (根左右)
    def pre_traverse(self,root):
        # 判断根节点是否为空,不为空则执行
        if root is not None:
             # 打印根节点
             print(root.value,end=' ')
            # 递归调用左子树
             self.pre_traverse(root.left)
             # 递归调用右子树
             self.pre_traverse(root.right)
    # 遍历二叉树,深度优先,中序遍历 (左根右)
    def mid_traverse(self,root):
        # 判断根节点是否为空,不为空则执行
        if root is not None:
             # 递归调用左子树
             self.mid_traverse(root.left)
             # 打印根节点
             print(root.value,end=' ')
             # 递归调用右子树
             self.mid_traverse(root.right)
    # 遍历二叉树,深度优先,后序遍历 (左右根)
    def post_traverse(self,root):
        # 判断根节点是否为空,不为空则执行
        if root is not None:
             # 递归调用左子树
             self.post_traverse(root.left)
             # 递归调用右子树
             self.post_traverse(root.right)
             # 打印根节点
             print(root.value,end=' ')
# 测试
def Dm01():
    # 创建二叉树
    tree = BinaryTree()
    # 添加节点
    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("\n先序遍历:")
    tree.pre_traverse(tree.root)
    # 中序遍历
    print("\n中序遍历:")
    tree.mid_traverse(tree.root)
    # 后序遍历
    print("\n后序遍历:")
    tree.post_traverse(tree.root)
# 运行测试
if __name__ == '__main__':
    Dm01()
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树广度优先遍历(BFS)可以使用队列来实现,具体步骤如下: 1. 创建一个空队列,并将根节点入队。 2. 当队列不为空时,执行以下操作: - 出队一个节点,将其值存储或打印。 - 将出队节点的左子节点入队(如果存在)。 - 将出队节点的右子节点入队(如果存在)。 3. 重复步骤2,直到队列为空。 下面是一个Python实现的示例代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bfs(root): if not root: return [] result = [] queue = [root] while queue: node = queue.pop(0) result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result ``` 对于深度优先遍历(DFS),有两种常用的方法:前序遍历、中序遍历和后序遍历。下面以前序遍历为例进行解释。 前序遍历的顺序是:根节点 -> 左子树 -> 右子树。具体实现步骤如下: 1. 创建一个空列表,用于存储遍历结果。 2. 定义一个辅助函数,接收一个节点作为参数: - 若节点为空,返回。 - 将节点的值存储或打印。 - 递归调用辅助函数遍历节点的左子树。 - 递归调用辅助函数遍历节点的右子树。 3. 调用辅助函数,将根节点作为参数传入。 下面是一个Python实现的示例代码: ```python def dfs(root): if not root: return [] result = [] def helper(node): if not node: return result.append(node.val) helper(node.left) helper(node.right) helper(root) return result ``` 这样,你就可以使用这两个函数来实现二叉树广度优先遍历和深度优先遍历了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值