二叉树的基本操作-C语言实现-数据结构作业

这篇具有很好参考价值的文章主要介绍了二叉树的基本操作-C语言实现-数据结构作业。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 (1)二叉树的创建;

(2)二叉树的先序、中序和后序遍历输出;

(3)输出二叉树的叶子节点和度为2的节点的数量;

(4)输出二叉树的深度;

(5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树);

(6)参考书上,二叉树按层次输出(一行输出一层);

(7)删除二叉树(释放二叉树所有节点空间);

完整代码

运行结果展示

编写一个带菜单的实验演示系统(参考前面实验的菜单系统)。要求演示以下功能(界面、函数及相关数据结构等根据需要自行设计和定义):

(1)二叉树的创建;

(2)二叉树的先序、中序和后序遍历输出;

(3)输出二叉树的叶子节点和度为2的节点的数量;

(4)输出二叉树的深度;

(5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树);

(6)参考书上,二叉树按层次输出(一行输出一层);

(7)删除二叉树(释放二叉树所有节点空间);

c语言二叉树的基本操作,学校作业,b树,数据结构,c++,二叉树,c语言

 (1)二叉树的创建;

BiTree CreatePreTree()//建立二叉树 
{
	char c;
	scanf("%c", &c);
	if (c == '#')  //表示空子树
		return NULL;
	else
	{
		BiTree T = (BiTree)malloc(sizeof(BiTreeNode));
		T->data = c;
		T->leftChild = CreatePreTree();
		T->rightChild = CreatePreTree();
		return T;
	}
}

(2)二叉树的先序、中序和后序遍历输出;

void PreOrder(BiTreeNode* root, void visit(DataType item)) {
	//前序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		visit(root->data);
		PreOrder(root->leftChild, visit);
		PreOrder(root->rightChild, visit);
	}
}
void InOrder(BiTreeNode* root, void visit(DataType item)) {
	//中序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		InOrder(root->leftChild, visit);
		visit(root->data);
		InOrder(root->rightChild, visit);
	}
}

void PostOrder(BiTreeNode* root, void visit(DataType item)) {
	//后序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		PostOrder(root->leftChild, visit);
		PostOrder(root->rightChild, visit);
		visit(root->data);
	}
}

(3)输出二叉树的叶子节点和度为2的节点的数量;

int Count1(BiTree bt)//计算叶子结点个数
{
	if (bt == NULL) return 0;
	else if (bt->leftChild == NULL && bt->rightChild == NULL)
		return 1;
	else
		return (Count1(bt->leftChild) + Count1(bt->rightChild));
}
int Count2(BiTree bt)//计算度为2的节点的数量
{
	int num = 0;
	if (bt)
	{
		if (bt->leftChild != NULL && bt->rightChild != NULL)
		{
			num = 1;
		}
		num += Count2(bt->leftChild) + Count2(bt->rightChild);
	}
	return num;
}

(4)输出二叉树的深度;

如果二叉树只有根节点,那么它的高度就为1。否则二叉树的高度等于1+左、右子树高度的较大者。按这种方法递归实现。

int Treehigh(BiTree bt)
{
	int lefthigh, righthigh, high;
	if (bt == NULL)  high = 0;//空树
	else
	{
		lefthigh = Treehigh(bt->leftChild);
		righthigh = Treehigh(bt->rightChild);
		int i = lefthigh > righthigh ? lefthigh : righthigh;//找到子树的深度
		high = i + 1;//子树深度+1=树的深度
	}
	return high;
}

(5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树);

c语言二叉树的基本操作,学校作业,b树,数据结构,c++,二叉树,c语言

void ChangeTree(BiTree bt)
{
	BiTree temp = (BiTree)malloc(sizeof(BiTreeNode));
	if (bt)
	{
		temp = bt->rightChild;
		bt->rightChild = bt->leftChild;
		bt->leftChild = temp;//上面三步,把bt结点的左右结点交换成功
		ChangeTree(bt->leftChild);
		ChangeTree(bt->rightChild);
	}
	else return;
}

(6)参考书上,二叉树按层次输出(一行输出一层);

Queue InitQueue()
{  //初始化队列
    Queue seq;
    for (int i = 0; i < QueueMax; i++)
    {
        seq.data[i] = NULL;
    }
    seq.head = 0;
    seq.rear = -1;
    seq.len = 0;
    return seq;
}
 
int IsEmptyQueue(Queue seq)
{  //队列判空
    if (seq.len == 0)  return 1; 
    return 0;
}
 
int IsFullQueue(Queue seq)
{  //队列判满
    if (seq.len == QueueMax)  return 1; 
    return 0;
}
 
void PushQueue(Queue* seq, BiTree T)
{  //入队
    if (IsFullQueue(*seq)) {
        printf("队列已满\n");
        return;
    }
    seq->rear = (seq->rear + 1) % QueueMax;
    seq->len++;
    seq->data[seq->rear] = T;
}
 
void PopQueue(Queue* seq, BiTree* T)
{  //出队
    if (IsEmptyQueue(*seq)) {
        printf("队列已空\n");
        return;
    }
    seq->head = (seq->head + 1) % QueueMax;
    *T = seq->data[seq->head];
    seq->len--;
}
 
void LevelOrder(BiTree T)
{  //层序遍历
    Queue seq = InitQueue();
    BiTree tmp = T;
    PushQueue(&seq, tmp);
    while (!IsEmptyQueue(seq)) 
    {
        printf("%c ", tmp->data);
        if (tmp->leftChild != NULL) 
        {
            PushQueue(&seq, tmp->leftChild);
        }
        if (tmp->rightChild != NULL) 
        {
            PushQueue(&seq, tmp->rightChild);
        }
        PopQueue(&seq, &tmp);
    }
}

(7)删除二叉树(释放二叉树所有节点空间);

先删除左子树,再删除右子树,最后删除根节点,采用递归实现。

void Destory(BiTree T) //后序遍历,释放结点空间
{
	if (T != NULL)
	{
		if (T->leftChild != NULL)    Destory(T->leftChild);
		if (T->rightChild != NULL) Destory(T->rightChild);
		free(T);
	}
}

完整代码

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define QueueMax 100
typedef char DataType;

typedef struct Node {
	//定义二叉树结点
	DataType data;
	struct Node* leftChild;
	struct Node* rightChild;
}BiTreeNode, * BiTree;

typedef struct
{//定义队列
	BiTree data[QueueMax];
	int head;
	int rear;
	int len;
}Queue;


//输    入:ABDGL###H###CEIM###JN##O##F#K#P##
BiTree CreatePreTree();  //建立二叉树
int Count1(BiTree bt);//二叉树的叶子节点的数量
int Count2(BiTree bt);//度为2的节点的数量
int Treehigh(BiTree bt);//二叉树的深度
void ChangeTree(BiTree bt);//交换左右子树
Queue InitQueue();  //初始化队列
int IsEmptyQueue(Queue seq);  //队列判空
int IsFullQueue(Queue seq);   //队列判满
void PushQueue(Queue* seq, BiTree T);  //入队
void PopQueue(Queue* seq, BiTree* T);  //出队
void LevelOrder(BiTree T);  //层序遍历
void PreOrder(BiTreeNode* root, void visit(DataType item));//前序遍历
void InOrder(BiTreeNode* root, void visit(DataType item));//中序遍历
void PostOrder(BiTreeNode* root, void visit(DataType item));//后序遍历
void visit(DataType item);//访问函数
void Destory(BiTree bt); //释放空间

int main()
{
	BiTree T;
	char sel = ' ';
	while (sel != '0')
	{
		printf("------二叉树演示系统-------\n");
		printf("   版本:1.0   作者:XXX 日期:2022-05-07\n");
		printf("------------------------------------------\n");
		printf("       1.创建二叉树\n");
		printf("       2.先序排列操作\n");
		printf("       3.中序排列操作\n");
		printf("       4.后序排列操作\n");
		printf("       5.输出二叉树的叶子节点和度为2的节点的数量\n");
		printf("       6.输出二叉树的深度\n");
		printf("       7.将二叉树所有节点的左右子树互换\n");
		printf("       8.层序排列操作\n");
		printf("       9.删除二叉树\n");
		printf("       0.退出系统\n");
		printf("请输入选项[0-9]:");
		sel = _getch();
		switch (sel)
		{
		case '1':
			printf("创建二叉树.\n");
			T = CreatePreTree();
			system("pause");
			break;
		case '2':
			printf("先序排列操作.\n");
			printf("前序遍历:");
			PreOrder(T, visit);//前序遍历
			system("pause");
			break;
		case '3':
			printf("中序排列操作.\n");
			printf("\n中序遍历:");
			InOrder(T, visit);//中序遍历
			system("pause");
			break;
		case '4':
			printf("后序排列操作.\n");
			printf("\n后序遍历:");
			PostOrder(T, visit);//后序遍历
			system("pause");
			break;
		case '5':
			printf("输出二叉树的叶子节点和度为2的节点的数量.\n");
			printf("叶子节点:%d个  \n", Count1(T));
			printf("度为2的节点:%d个\n", Count2(T));
			system("pause");
			break;
		case '6':
			printf("输出二叉树的深度.\n");
			printf("二叉树的深度为:%d\n", Treehigh(T));
			system("pause");
			break;
		case '7':
			printf("将二叉树所有节点的左右子树互换.\n");
			ChangeTree(T);
			system("pause");
			break;
		case '8':
			printf("层序排列操作.\n");
			printf("\n层序遍历:\n");
			LevelOrder(T);//层序遍历
			system("pause");
			break;
		case '9':
			printf("删除二叉树.\n");
			Destory(T);
			printf("删除成功\n");
			system("pause");
			break;
		case '0':
			printf("\n谢谢使用,再见!\n");
			break;
		default:
			printf("您输入的选项不合法,请重新选择!\n");
		}
	}
	return 0;
}
void visit(DataType item)
{
	printf("%c ", item);
}

BiTree CreatePreTree()//建立二叉树 
{
	char c;
	scanf("%c", &c);
	if (c == '#')  //空格 
		return NULL;
	else
	{
		BiTree T = (BiTree)malloc(sizeof(BiTreeNode));
		T->data = c;
		T->leftChild = CreatePreTree();
		T->rightChild = CreatePreTree();
		return T;
	}
}
void PreOrder(BiTreeNode* root, void visit(DataType item)) {
	//前序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		visit(root->data);
		PreOrder(root->leftChild, visit);
		PreOrder(root->rightChild, visit);
	}
}
void InOrder(BiTreeNode* root, void visit(DataType item)) {
	//中序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		InOrder(root->leftChild, visit);
		visit(root->data);
		InOrder(root->rightChild, visit);
	}
}

void PostOrder(BiTreeNode* root, void visit(DataType item)) {
	//后序遍历二叉树root,访问操作为visit
	if (root != NULL)
	{
		PostOrder(root->leftChild, visit);
		PostOrder(root->rightChild, visit);
		visit(root->data);
	}
}

Queue InitQueue()
{  //初始化队列
	Queue seq;
	for (int i = 0; i < QueueMax; i++)
	{
		seq.data[i] = NULL;
	}
	seq.head = 0;
	seq.rear = -1;
	seq.len = 0;
	return seq;
}

int IsEmptyQueue(Queue seq)
{  //队列判空
	if (seq.len == 0)  return 1;
	return 0;
}

int IsFullQueue(Queue seq)
{  //队列判满
	if (seq.len == QueueMax)  return 1;
	return 0;
}

void PushQueue(Queue* seq, BiTree T)
{  //入队
	if (IsFullQueue(*seq)) {
		printf("队列已满\n");
		return;
	}
	seq->rear = (seq->rear + 1) % QueueMax;
	seq->len++;
	seq->data[seq->rear] = T;
}

void PopQueue(Queue* seq, BiTree* T)
{  //出队
	if (IsEmptyQueue(*seq)) {
		printf("队列已空\n");
		return;
	}
	seq->head = (seq->head + 1) % QueueMax;
	*T = seq->data[seq->head];
	seq->len--;
}

void LevelOrder(BiTree T)
{  //层序遍历
	if (T == NULL) return;
	BiTree tmp = T;
	Queue seq = InitQueue();
	int curlevel = 1;
	int nextlevel = 0;
	PushQueue(&seq, tmp);
	while (!IsEmptyQueue(seq))//队列不空
	{
		printf("%c ", tmp->data);
		curlevel--;
		if (tmp->leftChild != NULL)
		{
			PushQueue(&seq, tmp->leftChild);
			nextlevel++;
		}
		if (tmp->rightChild != NULL)
		{
			PushQueue(&seq, tmp->rightChild);
			nextlevel++;
		}
		if (curlevel == 0)
		{
			printf("\n");
			curlevel = nextlevel;
			nextlevel = 0;
		}
		PopQueue(&seq, &tmp);
	}
}


int Count1(BiTree bt)
{
	if (bt == NULL) return 0;
	else if (bt->leftChild == NULL && bt->rightChild == NULL)
		return 1;
	else
		return (Count1(bt->leftChild) + Count1(bt->rightChild));
}
int Count2(BiTree bt)
{
	int num = 0;
	if (bt)
	{
		if (bt->leftChild != NULL && bt->rightChild != NULL)
		{
			num = 1;
		}
		num += Count2(bt->leftChild) + Count2(bt->rightChild);
	}
	return num;
}

int Treehigh(BiTree bt)
{
	int lefthigh, righthigh, high;
	if (bt == NULL)  high = 0;//空树
	else
	{
		lefthigh = Treehigh(bt->leftChild);
		righthigh = Treehigh(bt->rightChild);
		int i = lefthigh > righthigh ? lefthigh : righthigh;//找到子树的深度
		high = i + 1;//子树深度+1=树的深度
	}
	return high;
}

void ChangeTree(BiTree bt)
{
	BiTree temp = (BiTree)malloc(sizeof(BiTreeNode));
	if (bt)
	{
		temp = bt->rightChild;
		bt->rightChild = bt->leftChild;
		bt->leftChild = temp;//上面三步,把bt结点的左右结点交换成功
		ChangeTree(bt->leftChild);
		ChangeTree(bt->rightChild);
	}
	else return;
}

void Destory(BiTree T) //后序遍历,释放结点空间
{
	if (T != NULL)
	{
		if (T->leftChild != NULL)    Destory(T->leftChild);
		if (T->rightChild != NULL) Destory(T->rightChild);
		free(T);
	}
}

运行结果展示

c语言二叉树的基本操作,学校作业,b树,数据结构,c++,二叉树,c语言

 c语言二叉树的基本操作,学校作业,b树,数据结构,c++,二叉树,c语言

 以上就是关于二叉树所有的解析啦。如果对你有帮助,记得点赞👍收藏 关注哦!
我的主页还有其他文章,欢迎学习指点。
关注我,让我们一起学习,一起成长吧! 文章来源地址https://www.toymoban.com/news/detail-763006.html

到了这里,关于二叉树的基本操作-C语言实现-数据结构作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐树 🏳️‍🌈定义  🏳️‍🌈注意 🍔树的基本术语 ⭐二叉树 🏳️‍🌈定义 🎆二叉树和树的区别 🏳️‍🌈二叉树

    2024年02月05日
    浏览(35)
  • 二叉树的顺序存储及基本操作

    1、在树中除根结点外,其余结点分成m(m≥0)个(A)的集合T1,T2,T3…Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。 A、互不相交B、可以相交C、叶节点可以相交D、树枝结点可以相交 2、在一棵度为3的树中,度为3的结点数为2个,度为2的结点

    2024年02月06日
    浏览(26)
  • 二叉树的基本操作(共21个)

    先看几条定义: 1、 二叉树 是一种每个结点最多只能有两个孩子的树。 2、每一个子集本身又是一棵符合定义的树,叫做根节点的 子树 。 3、每一棵子树的根叫做根 r 的 孩子 ,而 r 是每一棵子树的根的 双亲。 4、具有相同双亲的结点称为 兄弟 。 5、树中结点所在的最大层次

    2023年04月20日
    浏览(16)
  • 头歌 二叉树的二叉链表存储及基本操作

    第1关 先序遍历创建二叉链表存储的二叉树及遍历操作   第2关 计算二叉树的高度、总节点个数和叶子节点个数   第3关 层次遍历二叉树   第4关 递归实现二叉树左右子树交换   第5关 非递归实现二叉树左右子树交换   第6关 非递归实现二叉树的中序遍历

    2024年02月03日
    浏览(15)
  • 数据结构实验4:二叉树的基本操作

    一、问题描述 运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的基本操作。 三、实验内容及要求 1、构造

    2024年01月23日
    浏览(19)
  • 深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

    二叉树(1): 深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树(2): 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客 前言: 在前面我们讲了堆及其应用,帮助我们初步了解了二叉树的一些原理,但那与真正的二叉树仍有不同,

    2024年04月09日
    浏览(25)
  • 数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)

    目录 二叉树的定义 二叉树具体的五种基本形态 1.空树 2.只有一个节点 3.有左子树,但右子树为空 4.有右子树,但左子树为空  5.左右两子树都不为空 特殊二叉树 斜二叉树 满二叉树  完全二叉树 二叉树的几个重要性质 初识二叉树的几个操作函数  二叉树T: 一个有穷的节点

    2024年02月03日
    浏览(29)
  • 吐血整理 二叉树(链表实现)的基本操作详解!

    本文是对二叉树这种数据结构基本操作与部分练习题的总结,内容庞大、详细、易懂,是你学习路上不容错过的优质博客! 既然是 链式二叉树 ,那必须得有自己的结点类型,以下是链式二叉树结点类型的定义,为了避免过多重复的代码,下面的问题都统一使用该结点类型。

    2024年02月03日
    浏览(34)
  • 【数据结构】_7.二叉树概念与基本操作

    目录 1.树形结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的应用—表示文件系统的目录树结构 ​编辑​2.二叉树 2.1 概念 2.2 特殊二叉树  2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储结构(数组存储结构) 2.4.2 链式存储结构 2.5 二叉树的基本操作 2

    2024年02月12日
    浏览(18)
  • 数据结构(C语言实现)——二叉树的概念及二叉树顺序结构和链式结构的实现(堆排序+TOP-K问题+链式二叉树相关操作)

    前面学习了数据结构中线性结构的几种结构,顺序表,链表,栈和队列等,今天我们来学习一种非线性的数据结构——树。由于二叉树是数据结构中的一个重点和难点,所以本文着重介绍二叉树的相关概念和性质,以及二叉树的应用。 树是一种非线性的数据结构,它是由n(

    2023年04月21日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包