02 二叉树的DFS(前序、中序或后序遍历实现)【Binary Tree 二叉树】

2023-11-07

二叉树的深度优先遍历主要有三种:
前序:根左右
中序:左根右
后序:左右根

下面是完整的实现和讲解:

#include <stdio.h>
#include <stdlib.h>

/*二叉树的深度遍历:
 * 例如二叉树
 *      1
 *     / \
 *    2   3
 *   /\
 * 4  5
 * 中序遍历:左根右 4-2-5-1-3
 * 前序遍历:根左右 1-2-4-5-3
 * 后序遍历:左右根 4-5-2-3-1
 *
 * 然而它的BFS(广度)或者水平层次遍历:1-2-3-4-5
 *
 */

/*二叉树构造*/
struct node {
    int data;
    struct node *left;
    struct node *right;
};

/*通过给定值,构造一颗二叉树,它的左右指针为NULL*/
struct node *newNode(int data) {
    //一说到要构造二叉树,就要相当要申请内存
    struct node *node = (struct node *) malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

/*中序遍历:左根右*/
void printInorder(struct node *node) {
    if (node == NULL){
        return;
    }

    //在递归的时候,如果node为null,例如node->left为NULL,printInorder(node->left)这个就没有任何输出
    //会继续执行下一句,printf("%d ",node->data);
    //遍历左子树
    printInorder(node->left);

    //遍历根结点
    printf("%d ",node->data);

    //遍历右子树
    printInorder(node->right);
}

/*前序遍历:根左右*/
void printPreorder(struct node* node){
    if (node == NULL){
        return;
    }

    //遍历根结点
    printf("%d ",node->data);

    //遍历左子树
    printPreorder(node->left);

    //遍历右子树
    printPreorder(node->right);
}

//后序遍历:左右根
void printPostorder(struct node* node)
{
    if (node == NULL)
        return;

    // first recur on left subtree
    printPostorder(node->left);

    // then recur on right subtree
    printPostorder(node->right);

    // now deal with the node
    printf("%d ", node->data);
}


int main() {
    //构造树
    //构造根节点
    struct node *root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    printf("\nPreorder traversal of binary tree is \n");
    printPreorder(root);//1 2 4 5 3

    printf("\nInorder traversal of binary tree is \n");
    printInorder(root);//4 2 5 1 3

    printf("\nPostorder traversal of binary tree is \n");
    printPostorder(root);//4 5 2 3 1

    return 0;
}

DFS三种遍历方式,采用递归的方式,相对来说比较好理解一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02 二叉树的DFS(前序、中序或后序遍历实现)【Binary Tree 二叉树】 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 格式说明符%02x

    我有一个简单的程序 include
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内

随机推荐

  • NIO之多路复用

    一 NIO简介 1 Java BIO 同步并阻塞 传统阻塞型 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理 如果这个线程不做任何事情就会造成不必要的开销 2 Java NIO 同步非阻塞 服务器实
  • js高阶函数

    高阶函数特点 1 函数的返回值是一个函数 2 函数的参数是一个函数 回调函数 高阶函数作用 1 将函数的参数预置 2 对函数进行功能扩展 高阶函数应用 闭包是基于高阶函数特性产生的 但高阶函数不一定就是闭包 Promise 函数柯里化 函数
  • react native中ScrollView嵌套TextInput安卓端有滑动问题

    react native中ScrollView嵌套TextInput安卓端有滑动问题 1 1 问题描述 react native中ScrollView嵌套TextInput TextInput组件设置了 textAligin right 后
  • Spring的BeanNameAware和BeanFactoryAware接口

    BeanNameAware 作用 让Bean获取自己在BeanFactory配置中的名字 根据情况是id或者name Spring自动调用 并且会在Spring自身完成Bean配置之后 且在调用任何Bean生命周期回调 初始化或者销毁 方法
  • Python装饰器学习(九步入门)

    原文链接 http www cnblogs com rhcad archive 2011 12 21 2295507 html 本文对原文略有改动 增加了自己的理解 装饰器其实也就是一个函数 一个用来包装函数的函数 返回一个修改之后的函数对
  • 【Python_Selenium学习笔记(三)】基于Selenium模块实现无界面模式 & 执行JS脚本(把滚动条拉到底部)

    基于Selenium模块实现无界面模式 执行JS脚本 把滚动条拉到底部 前言 此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 执行JS脚本 把滚动条拉到底部 并以具体的示例进行展示 正文 1 Selenium 设置无界面模
  • 【云原生之kubernetes实战】在k8s下部署Gitblit服务器

    云原生之kubernetes实战 在k8s下部署Gitblit服务器 一 Gitblit介绍 1 Gitblit简介 2 Gitblit特点 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 编辑gitblit ya
  • 树莓派4b: 初级使用(Ubuntu21.10,Windows11写入SSD,远程连接,软路由搭建,webmin安装,自建Dockerhub,远程管理, 百度云盘,阿里云盘同步等)

    虽然vps也便宜 但还是想买4b 树莓派4b显示器接线为 hdmini 买时没有附赠 所以以下均为mac系统下通过ssh操作 文章来自 http blog csdn net intbird 转载请说明出处 rasberrypi 4b 0 服
  • Java线程池execute()方法源码解析

    先看作者给出的注释来理解线程池到底有什么作用 Thread pools address two different problems they usually provide improved performance when execut
  • Git&GitHub简明使用

    主体内容来自B站UP主冯雨的视频教程 此为个人笔记分享 同时涉及对原视频的一些补充 原视频链接 语雀笔记链接 介绍 Git和GitHub是什么 Git是一个运行在电脑上的版本控制软件 GitHub是基于Git打造的网站 Git的三个概念 提
  • 史上最全python14张思维导图+零基础学习路线图,高清图可下载

    python语言是一个面向对象的编程语言 学习的难度比较小 python学习比较的简单 发展非常的好 比较的好找工作 而且相对发展也要比其他的编程语言少很多 python自学的过程中 可以去网上找一些基础的教学视频 像是python基础视频
  • 第十一届“泰迪杯”数据挖掘挑战赛赛前指导安排

    第十一届 泰迪杯 挑战赛报名一周了 许多的参赛队伍及带队老师都在咨询我们赛前指导安排及内容 今年的赛前指导安排还是分为了赛前指导录播课程及赛前指导直播两个模块 小编这就为大家介绍一下吧 赛前指导 赛前指导录播课程 2月25日9 00 4月1
  • eclipse安装教程(2023年2月)

    本人大数据专业 目前初学后端 也是初次安装 自己一步一步下载的过程 首先 单击到eclipse官网 在此页面向下滑动 可以看到第二个版本 比较适合我们初学者 结合自己电脑版本 选择右边对应版本进行点击 上述操作后 选择 gt gt Sele
  • Jacob处理Word文档的方法

    7 4 使用Jacob来处理Word文档 Word或Excel程序是以一种COM组件形式存在的 如果能够在Java中调用Word的COM组件 就能使用它的方法来获取Word文档中的文本信息 目前网上有许多提供这样的工具 7 4 1 Jaco
  • FIR滤波器和IIR滤波器的区别和选择

    1 在相同技术指标下 IIR滤波器由于存在着输出对输入的反馈 因而可用比FIR滤波器较少的阶数来满足指标的要求 这样一来所用的存储单元少 运算次数少 较为经济 例如用频率抽样法设计阻带衰减为 20db的FIR滤波器 其阶数要33阶才能达到
  • ubuntu:操作mysql

    ubuntu 操作mysql 1 终端启动MySQL etc init d mysql start 2 登录MySQL mysql u root p 用root账户登录 然后输入密码 3 查看所有的数据库名字 show databases
  • JPEG、GIF、PNG、BMP哪种图片格式的图片清晰一点

    BMP格式的图片是无损保存 质量最好 JPEG 是有损压缩 文件后辍名为 jpg 或 jpeg GIF 是用于压缩具有单调颜色和清晰细节的图像 如线状图 徽标或带文字的插图 的标准格式 PNG PNG使用从LZ77派生的无损数据压缩算法 一
  • 【算法】——冒泡排序与快速排序的分析

    目录 冒泡排序 冒泡排序的总结 快速排序 1 hoare版本 2 挖坑法 3 前后指针法 快排优化 优化一 三数取中 优化二 小区间优化 快速排序的总结 冒泡排序 冒泡排序的基本思想时 冒泡排序的步骤很简单 只需要将较大的值往后挪 直到将最
  • Unity编辑器编译性能调研

    1 测试模型对编译速度的影响 参考 提高Unity编译dll的速度 赵青青 博客园 cnblogs com 参考 1条消息 Unity插件推荐Editor Console Pro 那远远的云端 CSDN博客 2 测试场景模型 3 测试VSC
  • 02 二叉树的DFS(前序、中序或后序遍历实现)【Binary Tree 二叉树】

    二叉树的深度优先遍历主要有三种 前序 根左右 中序 左根右 后序 左右根 下面是完整的实现和讲解 include