数据结构初阶 遍历二叉树问题(一)

一. 链式二叉树的实现

1. 结构体代码

typedef int BTDateType;
typedef struct BinaryTreeNode
{BTDateType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;

大概的图形是这样子

2. 增删查改

我们这里要明确的一点的 二叉树的增删查改是没有意义的

为什么呢?

我们来看下图

 

这颗二叉树的排列没有任何的规律 并且我们要插入也不知道往哪里插入

所以说 单纯的对二叉树curd操作是没有任何意义的

那么我们学习二叉树的意义在哪里呢?

这里就要引出我们后面的搜索二叉树 平衡二叉树 以及红黑二叉树

这些知识我们都会在后面的博客中学习到

二. 二叉树的遍历

1. 二叉树遍历的三种方式

前序遍历

前序遍历的大概解释: 先遍历根 再遍历左数 再遍历右数

还是一样 我们先来看图

如果我们要使用前面序遍历这个图

那么打印的顺序会是什么呢?

画图来看看

打印的顺序如下: 

 

中序遍历

中序遍历的大概解释 先遍历左子树 再遍历根 再遍历右子树

这里大家可以试着自己做一下

后序遍历

后序遍历的大概解释 先遍历左子树 再遍历根 再遍历右子树

这个大家可以自己试着做一做 这里就不过多赘述了

2. 二叉树遍历的递归实现

我们首先先自己实现如图的一个二叉树出来

 

要想自己实现一个二叉树其实也很简单

我们先设计一个BuyBTnode函数 用来创建二叉树的节点

之后给每一个节点赋上值 左右节点各自指向如图的位置就可以

代码表示如下

//初始化
BTNode* BuyNode(BTDateType x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail");return NULL;}node->data = x;node->left = NULL;node->right = NULL;return node;
}
//造树
BTNode* CreatTree()
{BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);BTNode* node7 = BuyNode(7);//连接node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;node3->right = node7;return node1;
}

 

接下来我们就开始写递归函数了

代码表示如下

//前序列
void PreOrder(BTNode* root)
{if(root==NULL){printf("NULL");return;}printf("%d ", root->data);PreOrder(root->left);PreOrder(root->right);
}

我们可以发现 这里能够可以实现先序打印

那么我们试试看中序打印

(大家想想看 需要改变哪一行代码就可以实现中序打印)

//中序列
void InOrder(BTNode* root)
{if (root == NULL){printf("NULL");return;}InOrder(root->left);printf("%d ", root->data);InOrder(root->right);
}

这个就需要我们理解每一行的功能

这一行代码的功能是实现遍历左子树

preorder(root->left);

这一行代码的功能是遍历右子树

preorder(root->right);

那么想要先遍历左子树 然后遍历根 然后遍历右子树 需要什么样的顺序呢?

没错 这样子的三行代码就可以了

preorder(root->left);printf("%c ", root->date);preorder(root->right);

那么后序打印呢?

preorder(root->left);preorder(root->right);printf("%c ", root->date);

很简单是吧

3 二叉树求节点个数

这里有两种实现方式

第一种我们可以传一个count的地址进去 然后再遍历内部结构 如果不是空值就加一

思路大概是这样子

我们来看看函数实现

void  Treesize(BTNode* root, int* psize)
{if (root == NULL){return;}++(*psize);Treesize(root->left, psize);Treesize(root->right, psize);
}

这里还有另一种解法

我们使用递归实现

代码表示如下

int Treesize(BTNode* root)
{return root == NULL ? 0: Treesize(root->left)+ Treesize(root->right) + 1;
}

 我们发现也是可以完美实现

以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot + mybatis 多数据源切换

参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术的个人学习心得、作业及bug记录 Day1

黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖 Day1 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​…

hdu物联网硬件实验1 小灯闪烁

物联网硬件基础实验报告 学院 班级 学号 姓名 日期 成绩 实验题目 配置环境小灯 实验目的 配置环境以及小灯闪烁 硬件原理 无 关键代码及注释 /* Blink The basic Energia example. Turns on an LED on for one second, then off for one sec…

Mysql-常见DML-DQL-语句语法用法总结

1、常见DML语句 1.1 INSERT语句 说明:将数据插入到数据库表中。 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 实例:添加C罗信息到数据库表中 insert into employee (ID, name, gender, entrydate, age) values …

KUKA机器人维修保养消除报警

在使用KUKA机器人时,有时候会遇到示教器信息栏出现“基本检查到期”的信息,这就提示该机器到了基本保养时间了,需要进行保养。 一、报警信息和保养周期: KUKA机器人在使用超过一定保养周期后会出现“基本检查到期 / 中央手动保…

技术分析报告:StorageReview实验室打破π计算世界纪录

StorageReview实验室团队利用先进的计算系统,成功将π计算至202.112.290.000.000位,刷新了自己之前保持的105万亿位的世界纪录。这一成就突显了现代高性能计算(HPC)和精心设计的商用硬件平台的卓越能力。 关键技术组件&#xff1a…

【Unity navigation面板】

【Unity navigation面板】 Unity的Navigation面板是一个集成在Unity编辑器中的界面,它允许开发者对导航网格(NavMesh)进行配置和管理。 Unity Navigation面板的一些关键特性和功能: 导航网格代理(NavMesh Agent&…

Python爬虫获取视频

验证电脑是否安装python 1.winr输入cmd 2.在黑窗口输入 python.exe 3.不是命令不存在就说明python环境安装完成 抓取快手视频 1.在phcharm应用中新建一个项目 3.新建一个python文件 4.选择python文件,随便起一个名字后按回车 5.安装requests pip install requests 6.寻找需要的…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

【Python实战因果推断】23_倾向分3

目录 Propensity Score Matching Inverse Propensity Weighting Propensity Score Matching 另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对,并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景,您可…

Python使用matplotlib绘制图像时,中文图例或标题无法正常显示问题

Python使用matplotlib绘制图像时,中文图例或标题无法显示问题解决方法 一、问题描述二、解决方法 欢迎学习交流! 邮箱: z…1…6.com 网站: https://zephyrhours.github.io/ 一、问题描述 Matplotlib库是Python中经常使用的绘图工…

如何注册微信公众号

如何注册微信公众号 如何注册一个微信公众号 😊📱摘要引言正文内容1. 准备工作内容定位和受众群体公众号名称和头像 2. 网页注册流程第一步:访问微信公众平台第二步:选择账户注册类型第三步:填写基本信息第四步&#x…

树型结构数据存储实践

很多业务场景会遇到树形结构的数据,如公司的人员职级树、行政区划树等。 使用类似MySQL的数据库进行存储,需要将树形结构(二维)存储到行格式(一维)的db中。 本文介绍了树型结构数据存储的三种方式&#xf…

Java视频点播网站

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

[FreeRTOS 基础知识] 事件组 概念

文章目录 事件组 定义事件组 基本原理 事件组 定义 在实时操作系统(RTOS)中,事件组是一种用于任务间通信和同步的机制。事件组允许多个任务等待一个或多个事件的组合,当这些事件的组合满足特定条件时,任务可以被唤醒。…

vb.netcad二开自学笔记2:认识vs编辑器

认识一下宇宙第一编辑器的界面图标含义还是很重要的,否则都不知道面对的是什么还怎么继续? 一、VS编辑器中常见的图标的含义 变量 长方体:变量 局部变量 两个矩形块:枚举 预定义的枚举 紫色立方体:方法 橙色树状结构…

UE4_材质_材质节点_Fresnel

学习笔记,不喜勿喷,侵权立删,祝愿生活越来越好! 一、问题导入 在创建电影或过场动画时,你常常需要想办法更好地突显角色或场景的轮廓。这时你需要用到一种光照技术,称为边沿光照或边缘光照,它的…

Threejs环境、透视相机、坐标系、光源

文章目录 如何引入threejsnpm方式script方式script module方式 基本流程与坐标摄像机Geometry(几何体)和Material(材质)光源 如何引入threejs 对于很多刚刚上手threejs的朋友,可能第一步引入threejs就出问题了, 明明已经导入了,就是这样问题…

【搭建Nacos服务】centos7 docker从0搭建Nacos服务

前言 本次搭建基于阿里云服务器系统为(CentOS7 Linux)、Nacos(2.0.3)、Docker version 26.1.4 本次搭建基于一个新的云服务器 安装java yum install -y java-1.8.0-openjdk.x86_64安装驱动以及gcc等前置需要的命令 yum install …

【nvm管理nodejs版本,切换node指定版本】

nvm管理nodejs版本 nvm管理nodejs版本主要功能使用 nvm nvm管理nodejs版本 nvm(Node Version Manager)顾名思义node版本管理器,无须去node管网下载很多node安装程序;用于管理多个 Node.js 版本的工具。它允许你在同一台机器上同时安装和管理…