链式二叉树的代码总结

news2024/11/18 1:48:20

今天我带来链式二叉树的代码总结。



目录

    • 前言
    • 链式二叉树代码实现的五个文档
    • 二叉树的例子
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 层序遍历
    • 求结点个数的函数
    • 求叶子的个数的函数
    • 求k层结点个数的函数
    • 查找某一个值的函数
    • 求二叉树高度的函数
    • 判断二叉树是否是完全二叉树的函数
    • 开辟二叉树结点的函数
    • 销毁二叉树的函数
    • test.c文档的代码
    • Binary Tree.c文档的代码
    • Binary Tree.h文档的代码
    • 链式二叉树的代码的运行结果
    • 代码库:[链接](https://gitee.com/guangdong-xiaobit/preliminary-data-structure/tree/master/Binary%20Tree/Binary%20Tree)



前言

在下面的代码中,不采用函数来创建二叉树,在高阶数据结构再来写创建二叉树的函数,并且由于c没有队列,所以还要造个队列来调用,检验代码也不再以菜单的形式。在下面的代码中,我取出链式二叉树的代码,队列的代码包含在完整版,与前面文章有些不同,可在文章后面进去我的代码仓库中获取。



链式二叉树代码实现的五个文档

Queue.h-----队列的头文件引用和函数声明
Queue.c-----队列的函数实现
Binary Tree.h-----链式二叉树的头文件引用和函数声明
Binary Tree.c-----链式二叉树的函数实现
test.c-----链式二叉树代码的检验



二叉树的例子

请添加图片描述
我将采用上面的二叉树进行检验代码。



前序遍历

//前序遍历
void PrevOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ",root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}


中序遍历

//中序遍历
void InOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ",root->data);
	InOrder(root->right);
}


后序遍历

//后序遍历
void PostOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ",root->data);
}


层序遍历

//层序遍历
void LevelOrder(BinaryTree* root)
{
	assert(root);
	Queue q;
	InitQueue(&q);
	if (root)
		QueuePush(&q,root);
	while (!QueueEmpty(&q))
	{
		BinaryTree* Front = QueueFront(&q);
		printf("%d ",Front->data);
		QueuePop(&q);
		
     	if (Front->left)
			QueuePush(&q, Front->left);

		if (Front->right)
			QueuePush(&q,Front->right);
	}
	printf("\n");
	DestroyQueue(&q);
}


求结点个数的函数

//求结点的个数
int Treesize(BinaryTree* root)
{
	if (root == NULL)
		return 0;

	return Treesize(root->left) + Treesize(root->right) + 1;
}


求叶子的个数的函数

//求叶子的个数
int TreeLeafSize(BinaryTree* root)
{
	if (root ==  NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
		return 1;

	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}


求k层结点个数的函数

//求第k层结点的个数
int TreeKSize(BinaryTree* root,int k)
{ 
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKSize(root->left,k - 1) + TreeKSize(root->right,k - 1);
}


查找某一个值的函数

//查找某一个值
BinaryTree* TreeFind(BinaryTree* root,BinaryTreeDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	BinaryTree* ret1 = TreeFind(root->left,x);
	if (ret1)
		return ret1;

	BinaryTree* ret2 = TreeFind(root->right,x);
	if (ret2)
		return ret2;
}


求二叉树高度的函数

//求二叉树的高度
int TreeHeight(BinaryTree* root)
{
	if (root == NULL)
		return 0;
	
	int TreeLeftHeight = TreeHeight(root->left);
	int TreeRightHeight = TreeHeight(root->right);
	return TreeLeftHeight > TreeRightHeight ? TreeLeftHeight + 1 : TreeRightHeight + 1;
}


判断二叉树是否是完全二叉树的函数

//判断二叉树是否是完全二叉树
bool TreeComplete(BinaryTree* root)
{
	Queue q;
	InitQueue(&q);
	if (root)
		QueuePush(&q,root);
	while (!QueueEmpty(&q))
	{
		QueueDataType Front = QueueFront(&q);
		QueuePop(&q);
		if (Front == NULL)
		{
			break;
		}
		else
		{
			QueuePush(&q,Front->left);
			QueuePush(&q,Front->right);
		}
	}
	//出到空以后,如果后面全是空,则是完全二叉树
	while (!QueueEmpty(&q))
	{
		QueueDataType Front = QueueFront(&q);
		QueuePop(&q);
		if (Front != NULL)
			return false;
	}
	return true;
	DestroyQueue(&q);
}

开辟二叉树结点的函数

//开辟结点
BinaryTree* BuyTreeNode(BinaryTreeDataType x)
{
	BinaryTree* NewNode = (BinaryTree*)malloc(sizeof(BinaryTree));
	if (NewNode == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	NewNode->left = NULL;
	NewNode->right = NULL;
	NewNode->data = x;
}


销毁二叉树的函数

//销毁二叉树
void DestroyBTree(BinaryTree* root)
{
	if (root == NULL)
		return;

	DestroyBTree(root->left);	
	DestroyBTree(root->right);
	free(root);
}


test.c文档的代码

#include "Binary Tree.h"

int main()
{
	BinaryTree* n1 = BuyTreeNode(1);
	BinaryTree* n2 = BuyTreeNode(2);
	BinaryTree* n3 = BuyTreeNode(3);
	BinaryTree* n4 = BuyTreeNode(4);
	BinaryTree* n5 = BuyTreeNode(5);
	BinaryTree* n6 = BuyTreeNode(6);
	BinaryTree* n7 = BuyTreeNode(7);

	n1->left = n2;
	n1->right = n4;
	n2->left = n3;
	//接上则为完全二叉树
	//n2->right = n7;
	n4->left = n5;
	n4->right = n6;

	PrevOrder(n1);
	printf("\n");

	InOrder(n1);
	printf("\n");

	PostOrder(n1);
	printf("\n");

	LevelOrder(n1);
	printf("\n");

	printf("结点个数:%d\n", Treesize(n1));

	printf("叶子的个数:%d\n", TreeLeafSize(n1));

	printf("第三层的结点的个数:%d\n", TreeKSize(n1,3));

	printf("结点2的地址是:%p\n", TreeFind(n1,2));

	printf("二叉树的高度为:%d\n", TreeHeight(n1));

	printf("二叉树是否是平衡二叉树:%d", TreeComplete(n1));

	DestroyBTree(n1);
}



Binary Tree.c文档的代码

#include "Binary Tree.h"

//前序遍历
void PrevOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ",root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

//中序遍历
void InOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ",root->data);
	InOrder(root->right);
}

//后序遍历
void PostOrder(BinaryTree* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ",root->data);
}

//层序遍历
void LevelOrder(BinaryTree* root)
{
	assert(root);
	Queue q;
	InitQueue(&q);
	if (root)
		QueuePush(&q,root);
	while (!QueueEmpty(&q))
	{
		BinaryTree* Front = QueueFront(&q);
		printf("%d ",Front->data);
		QueuePop(&q);
		
     	if (Front->left)
			QueuePush(&q, Front->left);

		if (Front->right)
			QueuePush(&q,Front->right);
	}
	printf("\n");
	DestroyQueue(&q);
}

//求结点的个数
int Treesize(BinaryTree* root)
{
	if (root == NULL)
		return 0;

	return Treesize(root->left) + Treesize(root->right) + 1;
}

//求叶子的个数
int TreeLeafSize(BinaryTree* root)
{
	if (root ==  NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
		return 1;

	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

//求第k层结点的个数
int TreeKSize(BinaryTree* root,int k)
{ 
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKSize(root->left,k - 1) + TreeKSize(root->right,k - 1);
}

//查找某一个值
BinaryTree* TreeFind(BinaryTree* root,BinaryTreeDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	BinaryTree* ret1 = TreeFind(root->left,x);
	if (ret1)
		return ret1;

	BinaryTree* ret2 = TreeFind(root->right,x);
	if (ret2)
		return ret2;
}

//求二叉树的高度
int TreeHeight(BinaryTree* root)
{
	if (root == NULL)
		return 0;
	
	int TreeLeftHeight = TreeHeight(root->left);
	int TreeRightHeight = TreeHeight(root->right);
	return TreeLeftHeight > TreeRightHeight ? TreeLeftHeight + 1 : TreeRightHeight + 1;
}

//判断二叉树是否是完全二叉树
bool TreeComplete(BinaryTree* root)
{
	Queue q;
	InitQueue(&q);
	if (root)
		QueuePush(&q,root);
	while (!QueueEmpty(&q))
	{
		QueueDataType Front = QueueFront(&q);
		QueuePop(&q);
		if (Front == NULL)
		{
			break;
		}
		else
		{
			QueuePush(&q,Front->left);
			QueuePush(&q,Front->right);
		}
	}
	//出到空以后,如果后面全是空,则是完全二叉树
	while (!QueueEmpty(&q))
	{
		QueueDataType Front = QueueFront(&q);
		QueuePop(&q);
		if (Front != NULL)
			return false;
	}
	return true;
	DestroyQueue(&q);
}

//开辟结点
BinaryTree* BuyTreeNode(BinaryTreeDataType x)
{
	BinaryTree* NewNode = (BinaryTree*)malloc(sizeof(BinaryTree));
	if (NewNode == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	NewNode->left = NULL;
	NewNode->right = NULL;
	NewNode->data = x;
}

//销毁二叉树
void DestroyBTree(BinaryTree* root)
{
	if (root == NULL)
		return;

	DestroyBTree(root->left);	
	DestroyBTree(root->right);
	free(root);
}


Binary Tree.h文档的代码

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include "Queue.h"

typedef int BinaryTreeDataType;
typedef struct BinaryTree
{
	BinaryTreeDataType data;
	struct BinaryTree* left;
	struct BinaryTree* right;
}BinaryTree;

//前序遍历
void PrevOrder(BinaryTree* root);

//中序遍历
void InOrder(BinaryTree* root);

//后序遍历
void PostOrder(BinaryTree* root);

//层序遍历
void LevelOrder(BinaryTree* root);

//求结点的个数
int Treesize(BinaryTree* root);

//求叶子的个数
int TreeLeafSize(BinaryTree* root);

//求第k层结点的个数
int TreeKSize(BinaryTree* root,int k);

//查找某一个值
BinaryTree* TreeFind(BinaryTree* root,BinaryTreeDataType x);

//求二叉树的高度
int TreeHeight(BinaryTree* root);

//判断二叉树是否是完全二叉树
bool TreeComplete(BinaryTree* root);

//开辟结点
BinaryTree* BuyTreeNode(BinaryTreeDataType x);

//销毁二叉树
void DestroyBTree(BinaryTree* root);



链式二叉树的代码的运行结果

请添加图片描述

在这些运行结果中,除了求结点2的地址外,其他都可以通过文章上面的二叉树的图进行验证,结点2的地址可以通过调试进行验证,注意每次运行后,结点2的地址都会是不同的。



代码库:链接



今天链式二叉树的代码就讲到这里,关注点一点,下期更精彩。

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

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

相关文章

【设计模式】工厂方法模式

简单工厂模式的弊端 在简单工厂模式中只提供一个工厂类&#xff0c;该工厂类处于对产品类进行实例化的中心位置&#xff0c;它需要知道每一个产品对象的创建细节&#xff0c;并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时&#xff0c;必…

实现isReactive和isReadonly

08_实现isReactive和isReadonly 一、实现isReactive isReactive: 检查一个对象是否是由 reactive 创建的响应式代理。 1. 单元测试 // src/reactivity/tests/reactive.spec.tsimport { reactive, isReactive } from ../reactive;describe(reactive, function () {it(happy pa…

Callable接口

前言 获取多线程的方法&#xff0c;我们都知道有三种&#xff0c;还有一种是实现Callable接口 实现Runnable接口实现Callable接口实例化Thread类使用线程池获取Callable接口 Callable接口&#xff0c;是一种让线程执行完成后&#xff0c;能够返回结果的 在说到Callable接口…

【Unity天空盒】卡通渲染中如何实现云的消散效果

写在前面 完成大气渲染之后&#xff0c;接下来就是考虑云渲染了。因为我想做的天空盒本身是想跟着这位大佬Unity 卡通渲染 程序化天空盒 - 知乎里叙述的进程来的&#xff0c;里面云实现的是原神里的云&#xff0c;原神又是在崩3的基础上加上了消散效果。但现在能找到的一些教程…

线程中的sleep, yield, join

1. 前言 今天以具体实例的方法来详细记录下实战中的sleep, yield, join。 到底是什么意思&#xff0c;应该怎么用呢&#xff1f;&#xff1f;&#xff1f; 2. 适合人群 对该类方法的概念比较模糊的人 3. 开始 3.1 sleep 此方法是一个静态方法&#xff0c;可以通过类名直接调…

【MyBatis】安装 + 框架搭建 + 使用 + 优化(全程一条龙服务讲解~)

目录 前言 一、准备工作 1.1、下载MyBatis 1.2、数据库设计 二、搭建框架 2.1、创建Maven项目 2.2、jar包、引入依赖 2.3、创建MyBatis核心配置文件 2.4、映射文件 2.5、通过junit测试功能 2.6、框架优化 三、小结——注意事项 前言 本篇全程从0到1搭建MyBatis框架…

Python编程 简单春节倒计时教程(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用的技术 1.Tkinter 2.PHotoimage 函数 3.label组件 二.效果图 三…

pytorch 咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P6周&#xff1a;好莱坞明星识别&#x1f356; 作者&#xff1a;K同学啊一、前期准备 1.设置GPU import torch from torch import nn …

2022 年 pnpm 为什么这么火?

pnpm是 Node.js 的替代包管理器。它是 npm 的直接替代品&#xff0c;但速度更快、效率更高。 为什么更有效率&#xff1f;当你安装一个包时&#xff0c;我们将它保存在你电脑上的全局存储中&#xff0c;然后我们从它创建一个硬链接而不是复制。也就是说&#xff1a;对于模块的…

8.移动端学习-rem适配方案

1.适配方案 1、当设备尺寸发生变化时&#xff0c;页面宽高等比例变化 2、使用媒体查询根据不同设备按比例设置html字体大小&#xff0c;页面元素使用rem做单位&#xff0c;当html字体大小变化&#xff0c;元素尺寸也会发生变化&#xff0c;从而达到等比缩放的适配 2.rem实际开…

ubuntu18.04运行ORB_SLAM2

1、基础工具安装 安装cmake、git、gcc、g。 sudo apt-get install cmake git gcc g 2、安装Eigen库 在终端输入以下代码。 sudo apt-get install libeigen3-dev 3、安装Pangolin0.5 版本过高会导致错误&#xff0c;安装依赖项。 sudo apt-get install libglew-dev libpyth…

Hadoop之Hdfs

一、基本概述 1、定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目 录树来定位文件&#xff1b;其次&#xff0c;它是分布式的。HDFS 的使用场景&#xff1a;适合一次写入&#xff0…

这是长新冠,还是我老了?浙江出国抢订单又抢CTO;脉脉发布人才迁徙报告;元宇宙产业生态图谱;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 这是长新冠&#xff0c;还是我老了&#xff1f; 感染后身体出现了疲劳、关节疼痛、咳嗽等新症状&#xff1f;你并不孤单&#xff01;约翰霍普金斯…

数据结构进阶 二叉树OJ题一

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…

自动化信息治理:推动价值、安全性和合规性

现代组织充斥着数据&#xff0c;但信息的洪流可能变得势不可挡&#xff0c;危及利用其价值的能力。内容服务解决方案能够减轻洪水泛滥的风险&#xff0c;并帮助组织更好地控制信息。 从信息中获取价值的不同之处在于治理。建立正确的治理框架&#xff0c;组织可以最大限度地利…

难以挖掘的真相——塑料版薯条、意大利面、披萨……

下方图片中的“美食”&#xff0c;看起来是不是十分美味&#xff1f; ▲莱佛士平面设计学生作品 可千万要擦亮眼睛&#xff0c;它们其实是&#xff1a;黄色瓶盖“蛋黄”的荷包蛋&#xff0c;黄色吸管的“薯条”&#xff0c;桔黄色的塑料带子“意大利面”&#xff0c;红色塑料袋…

Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

系列文章目录 Exynos4412的Linux时钟驱动开发&#xff08;一&#xff09;——Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发&#xff08;二&#xff09;——clock的初始化&#xff08;CLK_OF_DECLARE的机制&#xff09; Exynos4412的Linux时钟驱动开发&#x…

新蜂商城 -- 代码学习研读

新蜂商城 -- 代码学习研读1.Big Data -- Postgres1.1 Big Data -- Postgres2.Big Data -- Postgres3.AwakeningGit Website: https://github.com/newbee-ltd/newbee-mall. 新蜂商城线上预览地址: http://mall.newbee.ltd. &#x1f449;&#x1f449;学习的朋友给个小星星.感…

蓝牙标签操作流程

电脑网页端后台系统 下载蓝牙标签APP注册账号&#xff0c;登录电脑网页端即可制作模板 蓝牙标签管理系统 安卓手机系统 1. 使用手机浏览器扫码下载 2. 拷贝链接到手机浏览器下载 http://a.picksmart.cn:8088/picksmart/app/new-app-release-v3.0.31.apk 苹果手机系统&#…

公众号运营要做什么?公众号运营规划方案分享

你真的理解什么是公众号运营吗&#xff1f; 公众号运营遵循的是创作-分发-增长-变现的路径&#xff0c;从内容创作到内容分发到用户增长&#xff0c;到最终的转化变现&#xff0c;这才是完整的一个运营闭环&#xff0c;在这条路径中&#xff0c;缺少了哪一环都将影响整体运营效…