【数据结构篇】~链式二叉树(附源码)

news2024/11/16 21:49:28

链式二叉树

  • 前言(含头文件)
    • 头文件
  • 1.链式二叉树的组成
  • 2.前、中、后、层序遍历
    • 1.前序遍历
    • 2.中序遍历
    • 3.后序遍历
  • 3.结点个数以及高度等​
  • 4.判断二叉树是否为完全二叉树

前言(含头文件)

之前的堆是特殊的二叉树是顺序结构的二叉树,而链式二叉树使用队列实现的。
二叉树的实现大部分都是递归,不要说看起来简单,写起来也是有一定难度的。但如果能理解的话,其实写起来也很简单

头文件

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include"Queue.h"
#include"Queue.c"
#include<stdbool.h>
typedef int btdatatype;
typedef struct binarytreenode {
	btdatatype data;
	struct binarytreenode* left;
	struct binarytreenode* right;
}btnode;
btnode* btbuynode(btdatatype x);
void preorder(btnode* root);//前序遍历(按照 根左右 的顺序)
void inorder(btnode* root);//中序遍历(按照 左根右)
void postorder(btnode* root);//后序遍历(按照 左右根)
int binarytreesize(btnode* root);// 二叉树结点个数 
int binarytreeleafsize(btnode* root);// 二叉树叶子结点个数
int binarytreelevelksize(btnode* root, int k);// 二叉树第k层结点个数 
int binarytreedepth(btnode* root);//二叉树的深度/高度
btnode* binarytreefind(btnode* root, btdatatype x);// 二叉树查找值为x的结点 
void binarytreedestory(btnode** root);// 二叉树销毁
// 层序遍历--要用队列(先进先出,不用递归了)实现
void LevelOrder(btnode* root);
// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(btnode* root);

1.链式二叉树的组成

节点由三部分组成
1.数据
2.左节点
3.右节点

在这里插入图片描述
在这里插入图片描述

2.前、中、后、层序遍历

遍历规则​
按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:​
1)前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发生在遍历其左右子树之前​
访问顺序为:根结点、左子树、右子树
2)中序遍历(Inorder Traversal):访问根结点的操作发生在遍历其左右子树之中(间)​
访问顺序为:左子树、根结点、右子树
3)后序遍历(Postorder Traversal):访问根结点的操作发生在遍历其左右子树之后​
访问顺序为:左子树、右子树、根结点

4)层序遍历(levelorder):就是一层一层去遍历

1.前序遍历

在这里插入图片描述

void preorder(btnode* root)//前序遍历
{
	if (root == NULL)
	{
		return;
	}
	printf("%d ", root->data);
	preorder(root->left);
	preorder(root->right);
}

2.中序遍历

在这里插入图片描述

void inorder(btnode* root)//中序遍历
{
	if (root == NULL)
	{
		return;
	}	inorder(root->left);
	printf("%d ", root->data);
	inorder(root->right);
}

3.后序遍历

在这里插入图片描述

void postorder(btnode* root)//后序遍历
{
	if (root == NULL)
	{
		return;
	}
	postorder(root->left);
	postorder(root->right);
	printf("%d ", root->data);
}```

##  4.层序遍历
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d72b3b942ac8419288a832c97cd4cc53.png)

```c
// 层序遍历--要用队列(先进先出,不用递归了)实现
void LevelOrder(btnode* root)
{
	qu q;
	quinit(&q);//初始化队列
	qupush(&q, root);
	//循环入队列取队头数据
	while (!quempty(&q))
	{
		btnode* fornt = qufront(&q);
		printf("%d ", fornt->data);
		qupop(&q);
		//把现在的队头出队列,入左右子树
		if(fornt->left)
		qupush(&q, fornt->left);
		if(fornt->right)
		qupush(&q, fornt->right);
	}
	//出循环时队列为空了

	qudestroy(&q);//销毁队列
}

3.结点个数以及高度等​

二叉树结点个数以及高度等问题最终都要转换为从左右子树入手!
在这里插入图片描述

//二叉树结点个数以及高度等问题最终都要转换为从左右子树入手!
// 二叉树结点个数 (这有个坑,不能直接用size)
int binarytreesize(btnode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return 1 + binarytreesize(root->left) + binarytreesize(root->right);
}
// 二叉树叶子结点(没有子节点的节点)个数
int binarytreeleafsize(btnode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
		return 1;
	return binarytreeleafsize(root->left) + binarytreeleafsize(root->right);
}
// 二叉树第k层结点个数(k走到第k层时,k=1)(递归下一层时,k要--)
int binarytreelevelksize(btnode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return binarytreelevelksize( root->left, k-1) +
		binarytreelevelksize( root->right,  k-1);
}
//二叉树的深度/高度
int binarytreedepth(btnode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftdepth = binarytreedepth( root->left);
	int rightdepth = binarytreedepth(root->right);
	return leftdepth > rightdepth ? leftdepth + 1 : rightdepth + 1;
	
	
} 
// 二叉树查找值为x的结点 (转换为从左右子树里找)
btnode* binarytreefind(btnode* root, btdatatype x)
{
	if (root == NULL)
		return NULL;
	if (x == root->data)
		return root;
	btnode*left= binarytreefind(root->left, x);
	if (left)
	{
		return left;
	}
	
	btnode*right= binarytreefind(root->right, x);
	if (right)
	{
		return right;
	}
	return NULL;

}
// 二叉树销毁(先销毁左右子树,再销毁根节点)
void binarytreedestory(btnode** root)
{
	if (*root == NULL)
		return ;
	binarytreedestory(&(*root)->left);
	binarytreedestory(&(*root)->right);
	//最后再把根节点释放掉
	free(*root);
	*root = NULL;
}

4.判断二叉树是否为完全二叉树

在这里插入图片描述

// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(btnode* root)
{
	qu q;
	//初始化
	quinit(&q);
	//把当前根节点入队列
	 qupush(&q,root);
	 while (!quempty(&q))
	 {
		 btnode* front = qufront(&q);
		 qupop(&q);
		 //然后把现在的数据出队头
		 if (front == NULL)
		 {
			 break;
		 }
		 //循环把左右子树入队列
		 qupush(&q, root->left);
		 qupush(&q, root->right);
	 }//出循环了,但队列不一定是空的
	 //出循环有两种可能
	 // (1.是完全二叉树,直接返回true就行)
	 // (2.不是完全二叉树,
	 // 是因为碰到了非完全二叉树的NULL被break才跳出的循环)
	//接下来循环取队列里剩下的数据,如果全是空,那就说明是完全二叉树
	 //如果队列里剩下的数据不全为空那就不是完全二叉树
	 while (!quempty(&q))
	 {
		 btnode* front = qufront(&q);
		 qupop(&q);
		 if (front == NULL)
		 {
			 qudestroy(&q);
			 return false;
		 }
	 }
	 //销毁
	qudestroy(&q);

	return true;
}

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

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

相关文章

python库(20):Jsonschema库描述JSON数据的规范

1 Jsonschema简介 在当今信息时代&#xff0c;数据规范与交换变得越来越重要&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络通信与前后端数据交互。 JSON Schema是一种用于描述JSON数据的规范…

计算机二级题--函数(scanf)章节

1.scanf函数 1. 2. A:默认使用scanf函数的时候&#xff0c;如果空格&#xff0c;回车或跳格就结束了&#xff0c;不能再继续输入了 (同上知识点&#xff09;

【JavaEE初阶】HTTP协议与使用Fiddler抓包

目录 &#x1f38d;HTTP协议是什么&#xff1f; &#x1f340;应用层协议&#xff08;HTTP&#xff09;存在的意义 &#x1f384;HTTP 协议的工作过程 &#x1f334;HTTP 协议格式 &#x1f333;Fiddler抓包工具的使用 &#x1f6a9;如何抓HTTPS的包&#xff1f; &#…

“视频号小店分销:让你的微信小店也能分销”

在数字时代的浪潮中&#xff0c;微信视频号利用其深厚的社交根基和庞大的用户基础&#xff0c;正逐渐成为新零售领域的一股新兴力量。特别是其视频号小店功能的推出&#xff0c;为商家提供了一个集商品展示、销售促进和营销策略于一体的全方位运营平台&#xff0c;实现了业务流…

医疗器械法规笔记

目录 前言医疗器械法规体系医疗器械监管注册与备案前言 之前的文章中介绍了与软件开发过程中相关的法规(网络安全),同时介绍了如何查找相关行业标准,这些都是平时工作中遇到的细节问题,没有系统性的呈现出医疗器械法规相关的框架,一直想对法规与标准有一个全面的认识和总…

java之继承与多态 1

1.继承的概念&#xff1a;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法&#xff0c;从而实现代码的重用和扩展。 父类&#xff08;超类&#xff09;&#xff1a;被继承的类。子类&#xff1a;继承父类的类。子类可以访问父…

OpenHarmony实战开发:Launcher应用安装问题分析报告

1 关键字 Launcher&#xff1b;Storage 2 问题描述 问题现象&#xff1a;安装应用到达 20 个以上后&#xff0c;重启设备&#xff0c;Launcher 页面没有任何应用图标 运行环境&#xff1a;硬件 dayu200&#xff0c;软件&#xff1a;3.1release 测试步骤&#xff1a; 使用…

DrawDB数据库设计工具本地部署结合内网穿透实现团队异地协作办公

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言…

Redis集群技术

目录 一、Redis安装部署 二、Redis主从复制 三、Redis哨兵模式 1、开启Redis哨兵模式 2、Redis哨兵模式选举MASTER全过程 3、Redis哨兵模式数据丢失风险的解决方案 四、Redis Cluster 1、Redis集群部署 2、Redis集群扩容 1、加入MASTER集群 2、分配槽位 3、添加slav…

Linux:开发工具(3)

一、版本控制器git 安装git指令 yum install git 1.1 举例理解版本控制器 举个例子&#xff1a; 比方说老师要求我们交一份实验报告&#xff0c;而你的室友张三是一个非常勤奋的人&#xff0c;所以他很早就写好了第一版交给老师&#xff0c;但老师的要求很高&#xff0c;他觉得…

将 github 仓库同步到个人服务器

场景 把本地项目推送到Github仓库后&#xff0c;如果想部署到服务器上&#xff0c;可以尝试此方案 我的博客是hugo搭建的&#xff0c;每次更新文章会手动推送到Github仓库&#xff0c; 然后利用Actions 脚本自动推送到cf或者vercel 之前我写过一篇 将 hugo 博客搬迁到服务器…

STM案例一:灯闪烁

一、使用元件 STlink&#xff0c;STM32F103C8T6 二、接线方法 STM32与STLINK的接线方法为&#xff1a; GND-->GND DCLK-->SWCLK DIO-->SWDIO 3.3-->3.3V 三、配置调试器 选择魔术棒按钮&#xff0c;单击Debug&#xff0c;选择ST-link Debug&#xff0c;选…

免费JSON在线解析工具网址

1&#xff0c;https://tool.juhe.cn/ JSON在线解析 (juhe.cn) 2&#xff0c;https://www.sojson.com/ JSON在线 | JSON解析格式化—SO JSON在线工具

阿卡迈2.0逆向

阿卡迈&#xff08;akamai&#xff09;我也是第一次第一次搞 阿卡迈检测挺多例如 ua 屏幕 document 自动化检测等等 &#xff0c;还有tls指纹 仅供学习参考吧 当cookie的_abck为 0表示通过&#xff0c;1表示不通过&#xff01;&#xff01;&#xff01; 测试了两个2.0站全都通…

一款特别牛逼还免费的屏幕演示批注注释工具,教学演示工具

功能强大&#xff0c;还免费&#xff01;PEVO Annotator 是一款功能强大的屏幕标注软件&#xff0c;广泛应用于教学演示、屏幕录像等场景。该软件支持多种操作系统&#xff0c;包括 macOS 和 Windows 。它提供了丰富的工具和功能&#xff0c;如画笔、直线、圆形、方形等形状绘制…

【海思3516DV500 | 开发环境】编译整个SDK全过程以及问题汇总

一、开发环境 上表是海思提供的Hi3519DV500 开发环境的各部分软件描述&#xff0c;实际用起来你就知道&#xff0c;可能有出入&#xff0c;尝试换Ubuntu 20.04折腾了好几天都不行&#xff0c;使用推荐的Ubuntu 18.04.2 64bit一个上午就行。 基本的硬件要求如下&#xff1a; ●…

Qt 解析多级XML

补充笔记&#xff1a;Qt 史上最详细 - “操作XML文件” - 笔记 一、如下图为XML文件 annotation为根节点&#xff0c; first第一节点&#xff0c;second第二节点&#xff0c;third第三节点。 二、实现解析xml文件&#xff0c;并将解析数据用QTreeView显示&#xff0c;实现代码…

AD9161调试问题

AD961同步信号SYNC无法保持高逻辑电 现象 配置ADF4351时钟芯片使其产生频率为1.6GHz的时钟为AD9161提供工作时钟&#xff0c;JESD的线速率配置为8Gbps&#xff0c;并配置AD9161的寄存器使其工作在2x内插模式以实现IQ信号的模数转换模式。同时根据AD9161芯片手册对ADF4351提供的…

NoSql数据库 Redis集群详解

目录 一、NoSql数据库简介 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 1.2 为什么还要用 NoSQL 数据库呢&#xff1f; 1.3 RDBMS和NOSQL的特点及优缺点&#xff1a; 二 Remote Dictionary Server 简介&#xff08;redis&#xff09; 2.1 什么是redis …

如何使用ssm实现物资进销存jsp

TOC ssm263物资进销存jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的…