当前位置: 首页 > news >正文

算法--解决二叉树遍历问题

第一 实现树的结构

class Node():
    # 构造函数,初始化节点对象,包含数据和左右子节点
    def __init__(self, data=None):
        self.data = data  # 节点存储的数据
        self.left = None  # 左子节点,默认为None
        self.right = None  # 右子节点,默认为None

    # 设置节点数据的方法
    def set_data(self, data):
        self.data = data  # 将传入的数据赋值给节点的data属性

    # 获取节点数据的方法
    def get_data(self):
        return self.data  # 返回节点的data属性

    # 设置左子节点的方法
    def set_left(self, node):
        self.left = node  # 将传入的节点赋值给当前节点的left属性

    # 获取左子节点的方法
    def get_left(self):
        return self.left  # 返回当前节点的left属性,即左子节点

    # 设置右子节点的方法
    def set_right(self, node):
        self.right = node  # 将传入的节点赋值给当前节点的right属性

    # 获取右子节点的方法
    def get_right(self):
        return self.right  # 返回当前节点的right属性,即右子节点

if __name__ == '__main__':
    # 创建根节点,数据为'a'
    root_node = Node('a')
    # 创建左子节点,数据为'b'
    left_node = Node('b')
    # 创建右子节点,数据为'c'
    right_node = Node('c')
    # 将左子节点设置到根节点的左子节点位置
    root_node.set_left(left_node)
    # 将右子节点设置到根节点的右子节点位置
    root_node.set_right(right_node)
    # 打印根节点的数据,左子节点的数据和右子节点的数据
    print(root_node.get_data(), root_node.get_left().data, root_node.get_right().data)

第二  二叉树递归遍历

#实现树的递归遍历(前、中、后以及层次的遍历),首先定义实现树结构的类Node。编写三个函数proorderO)、posorder0)和mid order0)分别实现先序遍历后序遍历和中序遍历。from collections import dequeclass Node():# 构造函数,初始化节点对象,包含数据和左右子节点def __init__(self, data=None, left=None, right=None):self.data = data  # 节点存储的数据self.left = left  # 左子节点,默认为Noneself.right = right  # 右子节点,默认为None# 前序遍历:先访问根节点,然后递归遍历左子树,最后递归遍历右子树def pro_order(self):print(self.data)  # 访问根节点if self.left:  # 如果存在左子节点,则递归遍历左子树self.left.pro_order()if self.right:  # 如果存在右子节点,则递归遍历右子树self.right.pro_order()# 中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树def mid_order(self):if self.left:  # 如果存在左子节点,则递归遍历左子树self.left.mid_order()print(self.data)  # 访问根节点if self.right:  # 如果存在右子节点,则递归遍历右子树self.right.mid_order()# 后序遍历:先递归遍历左子树,然后递归遍历右子树,最后访问根节点def pos_order(self):if self.left:  # 如果存在左子节点,则递归遍历左子树self.left.pos_order()if self.right:  # 如果存在右子节点,则递归遍历右子树self.right.pos_order()print(self.data)  # 访问根节点# 层序遍历:使用队列按层次顺序访问节点def row_order(self):queue = deque([self])  # 初始化队列,将根节点加入队列while queue:  # 当队列不为空时,进行遍历current_tree = queue.popleft()  # 从队列前端取出节点print(current_tree.data)  # 访问节点if current_tree.left is not None:  # 如果存在左子节点,则加入队列queue.append(current_tree.left)if current_tree.right is not None:  # 如果存在右子节点,则加入队列queue.append(current_tree.right)# 自定义遍历:使用栈按特定顺序访问节点def custom_order(self):stack = [self]  # 初始化栈,将根节点加入栈while stack:  # 当栈不为空时,进行遍历node = stack.pop()  # 从栈末端取出节点print(node.data)  # 访问节点if node.right is not None:  # 如果存在右子节点,则加入栈stack.append(node.right)if node.left is not None:  # 如果存在左子节点,则加入栈stack.append(node.left)# 主程序入口
if __name__ == '__main__':# 创建二叉树tree = Node('A', Node('B', Node('D'), Node('E')), Node('C', Node('F'), Node('G')))print("自定义遍历:")tree.custom_order()  # 执行自定义遍历

返回结果:

第一

第二

相关文章:

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数,初始化节点对象,包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点,默认为None self.rig…...

[刷题]入门1.矩阵转置

博客主页:算法歌者本篇专栏:[刷题]您的支持,是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接:洛谷-B2106-矩阵转置 2、基础 此题目主要考察二维数组的掌控能力。 3、思路 观察,可知&#…...

Flutter开发之flutter_local_notifications

flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时,默认调用此方法,将实例对象返回出去static NotificationHelper? _instance null;sta…...

Gradle和maven

大家好,我是风筝 作为Java 开发者,你平时用 Maven 还是 Gradle? 我一直用的都是 Maven,但是前几天做了一个小项目,用的是 Gradle,因为项目创建出来默认就是用的 Gradle,而且功能足够简单&#x…...

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机(Exchanges)4.2 临时队列(Temporary Queues&am…...

服务器被挂马怎么办?——解决服务器被挂马的方法和步骤

服务器被挂马(即被植入恶意软件)是一个常见的网络安全问题,可能导致数据泄露、服务中断和经济损失。本文将详细介绍如何检测和清除服务器上的恶意软件,并提供实用的代码示例,帮助读者解决服务器被挂马的问题。 一、什…...

Qt 项目架构设计

在开发一个 Qt 项目时,合理的文件夹结构和清晰的构建流程是非常重要的。Qt 项目通常需要管理源代码、UI 文件、资源文件、构建脚本等。下面我会给出一个详细的文件夹结构示例,并解释每个部分的作用及如何设计 Makefile 或使用 Qt 的 qmake 来自动化构建过…...

Elasticsearch:管理和排除 Elasticsearch 内存故障

作者:来自 Elastic Stef Nestor 随着 Elastic Cloud 提供可观察性、安全性和搜索等解决方案,我们将使用 Elastic Cloud 的用户范围从完整的运营团队扩大到包括数据工程师、安全团队和顾问。作为 Elastic 支持代表,我很乐意与各种各样的用户和…...

高级java每日一道面试题-2024年11月07日-Redis篇-Redis有哪些功能?

如果有遗漏,评论区告诉我进行补充 面试官: Redis有哪些功能? 我回答: Redis 是一个开源的、基于键值对的 NoSQL 数据库,以其高性能、丰富的数据结构和多种功能而闻名。在高级 Java 面试中,了解 Redis 的核心功能和高级特性是非常重要的。以下是 Redi…...

实用且免费的 IP 地域查询 API 接口推荐

实用且免费的 IP 地域查询 API 接口推荐 在日常开发中,IP 地域查询是一个常见需求。最近无意间发现一个实用的 IP 地域查询 API,目前是免费的,未来是否收费尚不可知,但在当前情况下非常值得推荐。 API 地址示例: ht…...

STM32学习笔记----SPI协议

STM32的SPI(串行外设接口,Serial Peripheral Interface)是一种常见的同步串行通信协议,广泛应用于与传感器、显示屏、存储设备等外设的通信。SPI通过主从模式(Master/Slave)来实现数据交换,其中…...

Ceph的pool有两种类型

Replicated Pool(拷贝型Pool,默认) 概述: 这是Ceph的默认存储池类型。它通过生成对象的多份拷贝来确保数据的冗余和高可用性。 工作原理: 每个存入的对象(Object)都会被存储为多个副本&#xf…...

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中,以建立自己的绘图方法。WizFlow附带了完整的流程图模板,以帮助您入门。…...

设计模式之插件模式

插件模式是一种设计模式,可以让您在不修改现有系统代码的情况下扩展功能,非常适合实现监控软件和交换机配置的解耦。在嵌入式Linux系统中,您可以使用C++实现插件机制,使监控软件能够动态加载交换机型号的配置模块。这种方式允许您通过插件形式快速适配新型号的交换机。 插…...

深度学习基础—Beam search集束搜索

引言 深度学习基础—Seq2Seq模型https://blog.csdn.net/sniper_fandc/article/details/143781223?fromshareblogdetail&sharetypeblogdetail&sharerId143781223&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 上篇博客讲到,贪心算…...

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种: TTL232485 串口的相关知识: 01-【HAL库】STM32实现串口打印(printf方式) , 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…...

任务调度中心-XXL-JOB使用详解

目录 详解 调度中心 执行器 原理 快速入门 源码仓库地址 1.初始化数据库 2.配置调度中心 1.解压源码 2.需改配置文件 3.启动调度中心 3.配置执行器 1.引入pom依赖 2.修改配置文件 3.执行器组件配置 4.部署执行器项目 4.开发第一个任务 BEAN模式(类…...

git本地分支推送到远程和远程pull到本地

文章目录 本地分支推送到远程仓库git拉取远程分支到本地 本地分支推送到远程仓库 要将本地分支推送到远程仓库的某个分支(可以是同名的分支,也可以是不同名的分支),你可以使用 git push 命令。这里有几种不同的情况: …...

Python_爬虫1_Requests库入门

目录 Requests库 7个主要方法 Requests库的get()方法 Response对象的属性 爬取网页的通用代码框架 理解requests库的异常 HTTP协议及Requests库方法 HTTP协议 HTTP协议采用URL作为定位网络资源的标识。 HTTP协议对资源的操作 理解PATCH和PUT的区别 HTTP协议与Requse…...

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识,有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言:面向过程,适用于系统…...

10分钟掌握R3nzSkin国服特供版:英雄联盟免费换肤完全指南

10分钟掌握R3nzSkin国服特供版:英雄联盟免费换肤完全指南 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server 厌倦了英雄联盟国服中千篇一律的默…...

倒置百分比堆叠面积图表示列详解|Highcharts大气成分图表代码

这是一个基于 Highcharts 实现的水平面积曲线图(areaspline 倒置坐标系),专门用于展示不同高度下地球大气成分的体积占比变化,是典型的百分比堆叠面积图,数据直观反映了大气层随高度升高的成分分布规律。我会从图表结…...

深度学习立体匹配:从MC-CNN架构解析到工程实践优化

1. 项目概述:从传统到深度,立体匹配的范式革新在计算机视觉领域,立体匹配是一个经典且核心的问题,它的目标是从一对经过校正的左右图像中,为每个像素找到其在另一幅图像中的对应点,从而计算出场景的深度信息…...

Windows微信QQ防撤回终极指南:RevokeMsgPatcher完整使用教程

Windows微信QQ防撤回终极指南:RevokeMsgPatcher完整使用教程 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitc…...

如何构建基于UNet的眼底血管图像分割系统

如何构建基于UNet的眼底血管图像分割系统 文章目录1. 数据预处理2. 定义UNet模型3. 训练过程4. 测试过程5. 日志记录1构建一个基于UNet的眼底血管图像分割系统涉及多个步骤,包括数据预处理、模型定义、训练过程、测试过程以及日志记录。下面是一个完整的指南&#x…...

在 WSL 中下载安装 MySQL,连接到 SQLyog(MySQL 安装在 WSL vs Windows 本地对比)

本文详细介绍了在Linux系统中检查MySQL服务状态的方法,包括使用ps -ef | grep mysql命令和排除grep进程的优化版本。 同时提供了MySQL安装验证和WSL环境下的配置指南,重点解决SQLyog连接WSL中MySQL的问题。 关键步骤包括:修改MySQL配置文件中…...

【信息科学与工程学】计算机科学与自动化——第二百篇 综合类算法篇01

Net-B1-001 Transformer 推理引擎 列 内容 (对应“大规模预训练Transformer模型的推理与优化”) 编号​ Net-B1-001 类型​ AI推理与优化系统 领域​ 人工智能 / 深度学习 模块​ Transformer 推理引擎 内存模式【主内存/GPU内的内存/Soc中的内存/其他芯片中的内存】…...

TencentDB Agent Memory 架构拆解:告别 Agent 失忆,构建四层可追溯记忆与上下文治理系统

拆解 TencentDB Agent Memory 如何用分层记忆、上下文卸载和降级检索,让 Agent 留住工作现场。 原文链接:AI 小老六 Agent 真正难用的地方,往往不是它不会调用工具,而是它记不住工作现场。 你刚给它讲完项目背景、编码偏好、部署…...

在Node.js后端服务中集成Taotoken实现稳定且低成本的大模型能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js后端服务中集成Taotoken实现稳定且低成本的大模型能力 对于需要在产品中集成智能对话功能的中小型团队而言,直…...

独立开发者如何利用Taotoken Token Plan套餐控制AI应用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken Token Plan套餐控制AI应用成本 对于独立开发者或小型工作室而言,在将大模型能力集成到自己…...