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 二叉树】 的相关文章

  • 检查空参数的最佳方法(保护子句)

    例如 您通常不希望构造函数中的参数为空 因此看到类似的内容是很正常的 if someArg null throw new ArgumentNullException nameof someArg if otherArg null throw
  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio

随机推荐

  • 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