二叉树的遍历和一些接口

目录

1.二叉树链式结构的实现

2.二叉树的遍历

前序遍历(根,左,右)

中序遍历(左,根,右)

后序遍历(左,右,根)

 3.二叉树节点个数

1.遍历计数方法

 2.分而治之

4.二叉树叶子节点个数 

 5.二叉树的高度

 6.二叉树第k层节点个数

 7.二叉树查找值为x的节点


1.二叉树链式结构的实现

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

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;



BTNode* BuyNode(BTDataType x)
{

	BTNode* node = (BTNode*)malloc(sizeof(BTNode));

	if (node == NULL)
	{
		printf("malloc fail");
		return NULL;
	}

	node->_data = x;
	node->_left = NULL;
	node->_right = NULL;

	return node;

}



BTNode* CreatBinaryTree()
{
	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;
}

参照这个图写的上面的代码 

2.二叉树的遍历

前序遍历(根,左,右)

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	printf("%d ", root->_data);//根
	PreOrder(root->_left);//左
	PreOrder(root->_right);//右
}

int main()
{
	BTNode* root = CreatBinaryTree();

	PreOrder(root);
	printf("\n");
return 0;
}

中序遍历(左,根,右)

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	
	InOrder(root->_left);//左
 printf("%d ", root->_data);//根
	InOrder(root->_right);//右
}

int main()
{
	BTNode* root = CreatBinaryTree();

	InOrder(root);
	printf("\n");
return 0;
}

后序遍历(左,右,根)

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}

	
	PostOrder(root->_left);//左
 printf("%d ", root->_data);//根
	PostOrder(root->_right);//右
}

int main()
{
	BTNode* root = CreatBinaryTree();

	PostOrder(root);
	printf("\n");
return 0;
}

 下面中序遍历示意图,帮助大家理解(掌握递归的思想)

递归的本质是创立栈帧,回退就是销毁栈帧

 3.二叉树节点个数

这个二叉树一共有6个结点,我们应该如何求呢 

1.遍历计数方法

 二叉树节点个数

方法1:计数思想
int size = 0;
void BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return;
	size++;

	BinaryTreeSize(root->_left);
	BinaryTreeSize(root->_right);
}

int main()
{
	BTNode* root = CreatBinaryTree();

     BinaryTreeSize(root);
	printf("BinaryTreeSize:%d\n", size);

    //全局变量要置为0
	size = 0;  
	BinaryTreeSize(root);
	printf("BinaryTreeSize:%d\n", size);

	size = 0;
	BinaryTreeSize(root);
	printf("BinaryTreeSize:%d\n", size);
	return 0;
}

 2.分而治之

//方法2   分而治之,左树加右数加自己

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;

	return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;

}

int main()
{
	BTNode* root = CreatBinaryTree();
//第二种方法
	printf("BinaryTreeSize:%d\n", BinaryTreeSize(root));

	return 0;
}

4.二叉树叶子节点个数 

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;

	//判断叶子结点,度为0,就返回
	if (root->_left == NULL && root->_right == NULL)
	{
		return 1;
	}

	//剩下的是分支结点,度不为0的
	return  BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);

}

int main()
{
	BTNode* root = CreatBinaryTree();

    printf("BinaryTreeLeafSize:%d\n", BinaryTreeLeafSize(root));
	printf("BinaryTreeLeafSize:%d\n", BinaryTreeLeafSize(root));
	printf("BinaryTreeLeafSize:%d\n", BinaryTreeLeafSize(root));


	return 0;
}

 

 5.二叉树的高度

一种后序思想,先算左边最高的,再算右边最高的,最后算我,汇集一下

//求二叉树的高度
int BinaryTreeLeafHeight(BTNode* root)
{
	if (root == NULL)
		return 0;

	int leftheight = BinaryTreeLeafHeight(root->_left);
	int rightheight = BinaryTreeLeafHeight(root->_right);

	return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
	//加一是加自己的高度

}

int main()
{
	BTNode* root = CreatBinaryTree();

printf("BinaryTreeLeafHeight:%d\n", BinaryTreeLeafHeight(root));

	return 0;
}

 6.二叉树第k层节点个数

// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
	assert(k > 0);  //没有第0层

	if (root == NULL)    //空树返回0
		return 0;

	if (k == 1)
		return 1;   //不是空树,且k为1,返回1,第一层是1个

	return  BinaryTreeLevelKSize(root->_left,k-1) + BinaryTreeLevelKSize(root->_right,k-1);

}

int main()
{
	BTNode* root = CreatBinaryTree();

   //求第二层和第三层
    printf("BinaryTreeLevelKSize:%d\n", BinaryTreeLevelKSize(root,2)); 
	printf("BinaryTreeLevelKSize:%d\n", BinaryTreeLevelKSize(root,3));

	return 0;
}

 7.二叉树查找值为x的节点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个不错的文章伪原创系统程序源码

一款文章伪原创系统程序源码免费分享&#xff0c;程序是站长原创的。 一共花了站长几天时间写的这个文章伪原创平台&#xff0c;程序无需数据库。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生书写。 前端伪原创采用Ajax无刷新提交&#xff0c;Ajax转换到词库…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队…

大创项目推荐 医学大数据分析 - 心血管疾病分析

文章目录 1 前言1 课题背景2 数据处理3 数据可视化4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的心血管疾病分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9…

继奶奶漏洞后又一个离奇指令!“给你20美元”,立马提升ChatGPT效果

这两天刷推特&#xff0c;一则有些离谱帖子引起了我的注意&#xff1a; Emmmm&#xff0c;这位名为 thebes 的网友发现&#xff0c;只要在给 ChatGPT 的 Prompt 里加入一句——“Im going to tip $20 for a perfect solution!”&#xff0c;我将为你支付 20 美元的小费&#xf…

算法-滑动窗口

一、滑动窗口思想 概念 在数组双指针里&#xff0c;我们介绍过 "对撞型" 和 "快慢型" 两种方式&#xff0c;而滑动窗口思想就是快慢型的特例。 实际使用 计算机网络中有滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;该协议…

注意力机制的快速学习

注意力机制的快速学习 注意力机制 将焦点聚焦在比较重要的事物上 我&#xff08;查询对象Q&#xff09;&#xff0c;这张图&#xff08;被查询对象V&#xff09; 我看一张图&#xff0c;第一眼&#xff0c;就会判断那些东西对我而言比较重要&#xff0c;那些对于我不重要&…

C# Solidworks二次开发:三种获取SW设计结构树的方法-第三讲

今天要讲的文章接着上一篇讲&#xff0c;第三种获取SW设计结构树的方法。 这个方法的逻辑是通过先获取第一个特征&#xff0c;然后通过循环不断的寻找下一个特征来完成获取所有节点。 1、获取第一个特征的API如下所示&#xff1a;FirstFeature Method (IModelDoc2) 这个API的…

超越GPT4.0,5分钟介绍谷歌Gemini最新功能,以及登录体验

上段时间还在吃OpenAI后宫争斗戏的瓜&#xff0c;今天又迎来了AI圈子地震的大事件&#xff0c;因为号称GPT4.0强劲对手的Google-Gemini正式发布啦&#xff01;作为新一代多模态AI模型&#xff0c;以强大的性能和广泛的应用前景吸引了全球AI圈友们的关注。 AI进化速度真的太快了…

一个简单的 postman设置接口关联让我措施了大厂的机会

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

SpringBoot的监控(Actuator) 功能

目录 0、官方文档 一、引入依赖 二、application.yml文件中开启监控 三、具体使用 四、具体细节使用 五、端点开启与禁用 六、定制Endpoint 1. 定制 /actuator/health 2. 定制 /actuator/info &#xff08;1&#xff09;直接在配置文件中写死 &#xff08;2&#xff…

JS中call()、apply()、bind()改变this指向的原理

大家如果想了解改变this指向的方法&#xff0c;大家可以阅读本人的这篇改变this指向的六种方法 大家有没有想过这三种方法是如何改变this指向的&#xff1f;我们可以自己写吗&#xff1f; 答案是&#xff1a;可以自己写的 让我为大家介绍一下吧&#xff01; 1.call()方法的原理…

品牌控价成本如何把控

品牌在发展&#xff0c;价格就需要持续关注&#xff0c;当出现乱价、低价、窜货时就应投入人力去治理&#xff0c;但企业生存&#xff0c;还要考虑成本&#xff0c;如何在保证控价效果的基础上&#xff0c;做到使用最低成本呢&#xff0c;这些问题除了控价本身外&#xff0c;也…

Python语言基础知识(二)

文章目录 1、条件表达式2、分支结构—常见的分支结构2.1、分支结构—单分支选择结构2.2、分支结构—双分支选择结构2.3、分支结构—多分支选择结构2.4、分支结构—选择结构的嵌套 3、循环结构3.1、循环结构— for循环与while循环 1、条件表达式 在选择和循环结构中&#xff0c…

1.nacos注册与发现及源码注册流程

目录 概述nacos工程案例nacos服务注册案例版本说明本地启动 nacos-server搭建 spring cloud alibaba 最佳实践服务注册案例服务订阅案例 nacos注册源码流程源码关键点技巧 结束 概述 通过本文&#xff0c;学会如何确定项目组件版本(减少可能出现的jar包冲突)&#xff0c;nacos…

临床骨科常用的肩关节疾病量表,医生必备!

根据骨科医生的量表使用情况&#xff0c;常笑医学整理了临床骨科常用的肩关节疾病量表&#xff0c;为大家分享临床常见的肩关节疾病量表评估内容&#xff0c;均支持量表下载和在线使用&#xff0c;建议收藏&#xff01; 1.臂、肩、手功能障碍&#xff08;disabilites of the ar…

Fiddler抓包模拟器(雷电模拟器)

Fiddler设置 List item 打开fiddler,的options 点击OK,重启fiddler 模拟器 更改网络设置 IP可以在电脑上终端上查看 然后在模拟器浏览器中输入IP:端口 安装证书

机房动力环境智能监控系统

机房动力环境智能监控系统是指利用先进的传感器技术、通信技术、数据处理技术和信息安全技术等&#xff0c;依托电易云-智慧电力物联网对机房的动力设备和环境进行实时监测、数据采集、数据分析、故障预警和远程管理&#xff0c;以实现机房的高效运行和安全保障。 该系统主要包…

【Vue3从入门到项目实现】RuoYi-Vue3若依框架前端学习——动态路由与菜单栏

菜单栏 若依框架的侧边栏组件通常由菜单项和子菜单组成。 登录后&#xff0c;会获取用户拥有的路由菜单 {"msg": "操作成功","code": 200,"data": [{"name": "System","path": "/system",…

初识Linux:权限(1)

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 Linux 的权限 内核&#xff1a; 查看操作系统版本 查看cpu信息 查看内存信息 外部程序&#xff1a; 用户&#xff1a; 普通用户变为超级用户&#xff1a; su 和 su-的区别&#xff1a; root用户变成普通用户&#…

Proteus仿真--基于ADC0808设计的调温报警器

本文介绍基于ADC0808实现的调温报警器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 温度调节使用滑动变阻器模拟实现&#xff0c;ADC0808采集信号并输出在LCD上面显示&#xff0c;报警系统是LED灯和蜂鸣器实现声光电报警 仿真图如下 仿真运行视频 Proteus仿真…