目录

1.介绍

(1)前序遍历

(2)定义结构体

(3)前序遍历实现

(4)中序遍历实现

(5)二叉树的节点个数

(6)二叉树树叶节点个数

(7)二叉树的高度

(8)二叉树节点的开辟

(9)建立一个测试二叉树

(10)测试二叉树相关函数的功能

(11)第k层的数据个数

(12)二叉树里面查找节点


1.介绍

(1)前序遍历

前序遍历就是针对于树根而言的,就是这个树的树根是先被我们遍历的,因为这个二叉树里面划分为树根,左子树和右子树,这个前中后表示的就是这三个里面的树根的访问顺序,树根先被访问就是前序遍历,树根是第二个被访问的就是中序遍历,最后被访问到就是后序遍历;

(2)定义结构体

下面看一下这个前序遍历的具体实现;

首先我们要进行这个结构体的定义,这个结构体就是表示的每一个节点,具体来讲就是包括这个节点数据,节点的左节点,节点的右节点;

(3)前序遍历实现

这个代码里面的N表示的就是这个位置的节点是不存在的,因为不是所有的节点都存在,就是标准情况下,一个节点应该是有两个子节点的,一个左节点,一个右节点,但是不可避免的有的节点是没有左节点,或者是没有右节点的,这个时候我们不会不打印任何数据,而是使用N代替说明这个位置的节点不存在;

(4)中序遍历实现

这个就是先访问左边的节点,再访问根节点,最后访问右边的节点,没有字节点的就会打印N代替

(5)二叉树的节点个数

这个地方是使用的递归的方法,如果自己没有根节点,说明这个二叉树的节点的个数是0,否则就是用递归去进行节点个数的计算;

(6)二叉树树叶节点个数

这个也是分为有树根节点,没有树根节点,以及正常的使用递归进行计算的情况,这个时候使用递归进行计算就不需要加上1,因为上面的加1表示这个要加上树根节点,但是这个地方计算的是树叶节点,所以不需要加上1;

(7)二叉树的高度

这个地方是使用这个leftheight表示这个左子树的高度,rightheight表示这个右子树的高度,这个地方其实是可以直接写到返回值里面的,但是这个地方使用的是递归,如果不进行这个临时变量的定义而是直接写到这个return里面,这个调用的次数就会增加,放到oj里面运行就不会通过,显示这个运行时间过长,我们定义两个中间变量就可以去解决这个问题;

(8)二叉树节点的开辟

使用malloc函数开辟内存空间,需要包含对应的文件stdlib.h

(9)建立一个测试二叉树

调用上面的buynode函数进行这个节点开辟,并建立不同的节点之间的连接关系,最后返回第一个节点;

(10)测试二叉树相关函数的功能

打印输出这个二叉树的高度,节点个数,树叶节点个数进行这个功能的测试;

(11)第k层的数据个数

使用递归,把下一层即k-1层的左子树和右子树节点数量的和作为这个返回值;

(12)二叉树里面查找节点

这个里面就是查找某一个特定的节点,这个节点作为返回值,我们定义两个临时变量作为左子树和右子树的返回值,如果左子树找到这个节点,我们就可以直接返回,否则的话,我们就需要去右子树去查找,找到这个节点后作为返回值,如果左子树,右子树找不到的话就返回NULL;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int btdatatype;
typedef struct binarytreenode
{btdatatype data;struct binarytree* left;struct binarytree* right;
}btnode;void prevorder(btnode* root)
{if (root == NULL){printf("N ");return;}printf("%d ", root->data);prevorder(root->left);prevorder(root->right);
}void inorder(btnode* root)
{if (root == NULL){printf("N ");return;}inorder(root->left);printf("%d ", root->data);inorder(root->right);
}int treesize(btnode* root)
{if (root == NULL){return 0;}return treesize(root->left) + treesize(root->right) + 1;
}int leafsize(btnode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return leafsize(root->left) + leafsize(root->right);
}int heightsize(btnode* root)
{if (root == NULL)return 0;int leftheight = heightsize(root->left);int rightheight = heightsize(root->right);return leftheight > rightheight ? heightsize(root->left) + 1 : heightsize(root->right) + 1;
}int treesizek(btnode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return treesizek(root->left, k - 1) + treesizek(root->right, k - 1);
}//二叉树里面查找指定的节点
btnode* treefind(btnode* root, btdatatype x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}btnode* ret1 = treefind(root->left, x);if (ret1){return ret1;}btnode* ret2 = treefind(root->right, x);if (ret2){return ret2;}return NULL;
}btnode* buynode(int x)
{btnode* node = (btnode*)malloc(sizeof(btnode));if (node == NULL){perror("malloc fail");return;}node->data = x;node->left = NULL;node->right = NULL;
}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);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;
}
int main()
{btnode* root = creattree();prevorder(root);printf("\n");inorder(root);printf("\n");int size = treesize(root);printf("treesize:%d\n", size);int size2 = leafsize(root);printf("leafsize:%d\n", size2);int size3 = heightsize(root);printf("heightsize:%d\n", size3);int size4 = treesizek(root,3);printf("treesizek:%d\n", size4);return 0;
}

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

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

相关文章

数仓工具—Hive语法之宏(Macro)

Hive中的宏 许多关系型数据库,如Teradata,支持宏(Macro)函数。在关系数据库管理系统(RDBMS)中,宏存储在数据字典中。用户可以共享宏,并根据需要执行它们。Hive宏与关系型数据库中的宏略有不同。在本文中,我们将检查什么是宏,它的语法,如何使用它们,以及一些宏的示…

java 字段 大于4000拆分

java 字段 大于4000拆分 public List<String> splitJsonIfNecessary(String jsonStr) {List<String> result new ArrayList<>();while (jsonStr.length() > Constant.MAX_LENGTH) {// 直接按字符数截取&#xff0c;不考虑JSON结构String part jsonStr.s…

东软医疗 踩在中国医疗科技跃迁的风口上

恐怕没有哪一家本土医疗装备企业能像东软医疗一样&#xff0c;每一段成长的升维都发生在中国医疗科技跃迁史最重要的节点上。 在工业制造领域&#xff0c;医疗装备产业由于涉及数十个学科领域&#xff0c;其技术复合程度毫不逊于今天公众所熟知的EUV光刻机&#xff0c;是一门技…

【TES807】 基于XCKU115 FPGA的双FMC接口万兆光纤传输信号处理平台

板卡概述 TES807是一款基于千兆或者万兆以太网传输的双FMC接口信号处理平台。该平台采用XILINX的Kintex UltraSacle系列FPGA&#xff1a;XCKU115-2FLVF1924I作为主处理器&#xff0c;FPGA外挂两组72位DDR4 SDRAM&#xff0c;用来实现超大容量数据缓存&#xff0c;DDR4的最高数据…

08-8.5.1 归并排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

Linux容器时间隔离性测试

在宿主机和容器内同时执行date命令获取时间 date可以看到宿主机和容器内的时间一致 在宿主机修改时间 date -s "2022-01-01 12:00:00"在宿主机和容器内同时执行date命令获取时间 date 可以看到时间都修改为了2022年 在宿主机执行命令将时间修改回去 sudo date -s &qu…

《云原生安全攻防》-- 容器攻击案例:Docker容器逃逸

当攻击者获得一个容器环境的shell权限时&#xff0c;攻击者往往会尝试进行容器逃逸&#xff0c;利用容器环境中的错误配置或是漏洞问题&#xff0c;从容器成功逃逸到宿主机&#xff0c;从而获取到更高的访问权限。 在本节课程中&#xff0c;我们将详细介绍一些常见的容器逃逸方…

摸鱼大数据——Kafka——kafka tools工具使用

可以在可视化的工具通过点击来操作kafka完成主题的创建&#xff0c;分区等操作 注意: 安装完后桌面不会有快捷方式,需要去电脑上搜索,或者去自己选的安装位置找到发送快捷方式到桌面! 连接配置 创建主题 删除主题 主题下的数据查看 数据显示问题说明 修改工具的数据显示类型 发…

设计模式使用场景实现示例及优缺点(行为型模式——命令模式)

从前&#xff0c;在一个美丽而神秘的王国里&#xff0c;住着一位智慧而仁慈的国王。他不仅以其公正和睿智著称&#xff0c;还因为他对知识的热爱和追求。他的王国繁荣昌盛&#xff0c;人们生活幸福安康。但即便如此&#xff0c;国王知道&#xff0c;要维持这种繁荣与和平&#…

编程参考 - Rule of Three and the Rule of Five in C++

C 中的 "三规则 "和 "五规则 "是管理类中资源管理函数&#xff08;特殊成员函数&#xff09;的准则。这些规则有助于确保类正确一致地管理动态内存、文件句柄或网络连接等资源。 The Rule of Three and the Rule of Five in C are guidelines for managing…

【C++题解】1168. 歌唱比赛评分

问题&#xff1a;1168. 歌唱比赛评分 类型&#xff1a;数组找数 题目描述&#xff1a; 四&#xff08;1&#xff09; 班要举行一次歌唱比赛&#xff0c;以选拔更好的苗子参加校的歌唱比赛。评分办法如下&#xff1a;设 N 个评委&#xff0c;打 N 个分数&#xff08; 0≤每个分…

Linux C语言基础 day10

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.指针指向数组 1.1 指针与数组的关系 1.2 指针与一维数组关系实现 1.2.1 指针与一维数组的关系 1.2.2 指针指向一维整型数组作为函数参数传递 课外作业&#xff1a; 学习目标&#xff1a; 一周掌握 C基础知识 学习内…

卡码网语言基础课 | 10. 平均绩点

目录 1、问题描述2、知识点① 字符串格式化输出② 保留小数 3、代码 1、问题描述 题目描述&#xff1a;每门课的成绩分为A、B、C、D、F五个等级&#xff0c;为了计算平均绩点&#xff0c;规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。 输入描述&#xff1a;有多组测试…

RandomAccessFile详细总结

RandomAccessFile 是 Java 中一个非常特殊的类&#xff0c;它既可以用来读取文件&#xff0c;也可以用来写入文件。与其他 IO 类&#xff08;如 FileInputStream 和 FileOutputStream&#xff09;不同&#xff0c;RandomAccessFile 允许您跳转到文件的任何位置&#xff0c;从那…

【全面介绍Pip换源】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

CV11_模型部署pytorch转ONNX

如果自己的模型中的一些算子&#xff0c;ONNX内部没有&#xff0c;那么需要自己去实现。 1.1 配置环境 安装ONNX pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple 安装推理引擎ONNX Runtime pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/si…

基于Java的斗地主游戏案例开发(做牌、洗牌、发牌、看牌

package Game;import java.util.ArrayList; import java.util.Collections;public class PokerGame01 {//牌盒//♥3 ♣3static ArrayList<String> list new ArrayList<>();//静态代码块//特点&#xff1a;随着类的加载而在加载的&#xff0c;而且只执行一次。stat…

底软驱动 | C++内存相关

文章目录 C内存相关C内存分区C对象的成员函数存放在内存哪里 堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C内存泄漏的几种情况内存对齐柔性数组参考推荐阅读 C内存相关 本篇介绍了 C 内存相关的知识。 C内存分区 在C中&#…

力扣第八题——字符串转换整数

题目介绍 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数。 函数 myAtoi(string s) 的算法如下&#xff1a; 空格&#xff1a;读入字符串并丢弃无用的前导空格&#xff08;" "&#xff09;符号&#xff1a;检查下一个字…

TCP重传、滑动窗口、流量控制、拥塞控制机制

目录 1、TCP重传机制超时重传快速重传 2、滑动窗口3、流量控制4、拥塞控制1、慢启动2、拥塞避免3、拥塞发生 1、TCP重传机制 TCP 针对数据包丢失的情况&#xff0c;会用重传机制解决。 超时重传 就是在发送数据时&#xff0c;设定一个定时器&#xff0c;当超过指定的时间还没…