首页 > 编程语言 >【数据结构篇】~链式二叉树(附源码)

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

时间:2024-08-26 20:50:34浏览次数:7  
标签:遍历 return btnode 源码 right 二叉树 数据结构 root

链式二叉树

前言(含头文件)

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

头文件

#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;
}

标签:遍历,return,btnode,源码,right,二叉树,数据结构,root
From: https://blog.csdn.net/2301_81806517/article/details/141572644

相关文章

  • 苹果cms影视海螺模板V4.0优化版整站源码
    苹果cms影视海螺模板V4.0优化版整站源码苹果CMS是一款流行的影视网站管理系统,它允许用户轻松地创建和管理自己的影视内容网站。影视海螺模板V4.0优化版是针对苹果CMS设计的一个模板,它提供了更加美观和功能丰富的界面,以及一些性能和用户体验上的优化。以下是关于苹果CMS影视海......
  • 新Java萝卜影视4.0.5原生源码【完美修复完整版】
    新Java萝卜影视4.0.5原生源码【完美修复完整版】新Java萝卜影视4.0.5原生源码【完美修复完整版】源码介绍新Java萝卜影视4.0.5是一个基于Java语言开发的影视播放应用。该版本在原有基础上进行了多项优化和修复,提升了应用的稳定性和用户体验。源码采用原生Java编写,适合Java开......
  • Python数据结构实战:列表、字典与集合的高效使用
    在日常的编程工作中,选择合适的数据结构对于提高程序效率至关重要。Python提供了丰富的内置数据结构,其中最常用的就是列表(List)、字典(Dictionary)和集合(Set)。本文将深入探讨这些数据结构,并介绍它们的内部实现以及如何高效地使用它们。1.列表(List)1.1定义与创建列表是......
  • Python数据结构精要:选择与应用
    数据结构是计算机科学中一个重要的概念,它涉及到如何组织和存储数据以便于高效地访问和修改。Python作为一种高级编程语言,提供了多种内置的数据结构来满足不同的需求。本文旨在介绍Python中常见的几种数据结构,并通过实例来说明它们的使用场景和优缺点。Python中的基本数......
  • 计算机毕业设计-基于Java+SSM架构的高校毕业生就业管理系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • cats 的数据结构
    相信OI美学点击查看代码#include<bits/stdc++.h>usingnamespacestd;vector<int>a[200005];intf[200005],s[200005],ansa[200005],ansb[200005];voiddp(intn1){s[n1]=1;f[n1]=n1;for(inti=0;i<a[n1].size();i++){dp(a[n1][......
  • 【含文档】基于Springboot+Vue的流浪猫狗救助救援系统(含源码数据库)
    1.开发环境开发系统:Windows10/11架构模式:MVC/前后端分离JDK版本:JavaJDK1.8开发工具:IDEA数据库版本:mysql5.7或8.0数据库可视化工具:navicat服务器:SpringBoot自带apachetomcat主要技术:Java,Springboot,mybatis,mysql,vue2.视频演示地址3.功能该系统......
  • 基于SSM的校园快递服务管理系统【附源码+文档】
    ......
  • java+vue计算机毕设特色农产品销售系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网普及率的不断提高,电子商务已成为推动传统产业升级转型的重要力量。在农业领域,特色农产品的销售长期面临信息不对称、......
  • java+vue计算机毕设天津市为民律师事务所信息管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,律师事务所作为法律服务的重要提供者,其内部管理与服务效率直接影响到客户体验及行业竞争力。天津市为民律师事务所作为本地区......