数据结构与算法--C++实现二叉树的基本操作

7 篇文章 2 订阅
2 篇文章 0 订阅

数据结构与算法–C++实现二叉树的基本操作

在学习数据结构与算法这门课中,老师布置了一个关于二叉树的实验作业。实验作业的要求如下所示:
在这里插入图片描述
经过了几天的不懈努力(到处学习补知识),终于能够实现二叉树实验。

下面就是该实验的过程,成果图以及代码:
主要内容:主要使用了循环递归的思想,其中还使用了链表,栈与队列的操作。

根据该二叉树图来创建二叉树。(图中的#是表示空结点)
在这里插入图片描述

效果图:
创建二叉树:
根据先序遍历的方法,依次输入权值来创建二叉树。
在这里插入图片描述
输出中序遍历:
中序遍历(左结点-根节点-右结点)–D G B A E C F
在这里插入图片描述
输出先序遍历:
先序遍历(根节点-左结点-右结点)–A B D G C E F
在这里插入图片描述

输出后序遍历:
后序遍历(左结点-右结点-根节点)–G D B E F C A
在这里插入图片描述
后面的内容就不逐一演示了,大概就这样,最后附上这次实验的代码(供大家学习参考)。

附上代码:

#include <iostream>
#include <stdio.h>
using namespace std;
#define ElemType char

typedef struct BiTNode {//结点结构体
	ElemType data;
	struct BiTNode* lchild, * rchild;//左结点,右结点
}BiTNode, * BiTree;


BiTNode* creat() {//创建二叉链表
	struct BiTNode* bt;
	char ch;
	cout << "输出你想赋予的权值:";
	cin >> ch;
	if (ch == '#')bt = nullptr;
	else {
		bt = new struct BiTNode;
		bt->data = ch;
		bt->lchild = creat();
		bt->rchild = creat();
	}
	return bt;
}

void m_traverse(BiTNode *bt) {//中序遍历(递归)
	if (bt == nullptr)return;
	else {
		m_traverse(bt->lchild);
		cout << bt->data << "\t";
		m_traverse(bt->rchild);
	}
}

void b_traverse(BiTNode* bt) {//后序遍历(递归)
	if (bt == nullptr)return;
	else {
		b_traverse(bt->lchild);
		b_traverse(bt->rchild);
		cout << bt->data << "\t";
	}
}

void f_traverse(BiTNode* bt) {//先序遍历(递归)
	if (bt == nullptr)return;
	else {
		cout << bt->data << "\t";
		f_traverse(bt->lchild);
		f_traverse(bt->rchild);
	}
}

void mm_traverse(BiTNode* bt) {//中序遍历(非递归)
	BiTNode* a[10];//充当一个栈,该栈的最大容量为10
	int count = -1;//充当一个栈的指针
	if (bt == nullptr)return;
	while (bt != nullptr || count != -1) {
		while (bt!= nullptr) {
			a[++count] = bt;
			bt = bt->lchild;
		}
		if (count != -1) {
			bt = a[count];
			cout << bt->data << "\t";
			count--;
			bt = bt->rchild;
		}
	}
}

void c_traverse(BiTNode* bt) {//层序遍历
	if (bt == nullptr)return;
	BiTNode* a[20] = { nullptr };//充当队列
	int count = -1;//充当队列的队尾
	int top = 0;//充当队列的队头
	while (bt != nullptr || top != count + 2){
		cout << bt->data << "\t";
		if (bt->lchild != nullptr)a[++count] = bt->lchild;
		if (bt->rchild != nullptr)a[++count] = bt->rchild;
		bt = a[top++];
	}
}

int layer(BiTNode* bt) {//高度
	int h1;
	int h2;
	if (bt == nullptr)return 0;
	else {
		h1 = layer(bt->lchild);
		h2 = layer(bt->rchild);
		return h1 > h2 ? ++h1 : ++h2;
	}
}

int node(0);
void Node(BiTNode* bt) {//结点
	if (bt == nullptr)return;
	else {
		node++;
		Node(bt->lchild);
		Node(bt->rchild);
	}
}

int leaf_node(0);
void Leaf_Node(BiTNode* bt) {//叶子结点
	if (bt == nullptr)return ;
	else {
		if (bt->lchild == nullptr && bt->rchild == nullptr)leaf_node++;
		 Leaf_Node(bt->lchild);  
		 Leaf_Node(bt->rchild);  
	}
}

void change_Node(BiTNode* &bt) {//交换左结点与右结点
	BiTNode *cbt = new struct BiTNode;
	if (bt!=nullptr) {
		if (bt->lchild == nullptr && bt->rchild == nullptr)return;
		cbt = bt->lchild;
		bt->lchild = bt->rchild;
		bt->rchild = cbt;
		change_Node(bt->lchild);
		change_Node(bt->rchild);
	}
}

int main() {//主函数菜单
	struct BiTNode* tree;
	tree = new struct BiTNode;
	char n;
	cout << "欢迎使用小小城序员的树与二叉树:" << endl;
	while (true) {//menu
		cout <<endl<< "1.创建二叉树的二插链表" << endl;
		cout << "2.输出二叉树的中序遍历(递归)" << endl;
		cout << "3.输出二叉树的先序遍历" << endl;
		cout << "4.输出二叉树的后序遍历" << endl;
		cout << "5.输出二叉树的中序遍历(非递归)" << endl;
		cout << "6.输出二叉树的层序遍历" << endl;
		cout << "7.输出二叉树的高度" << endl;
		cout << "8.输出二叉树的结点个数" << endl;
		cout << "9.输出二叉树的叶子个数" << endl;
		cout << "0.交换二叉树每个结点的左子树与右子树" << endl;
		cout << "退出请按q" << endl;
		cout << "请选择你的操作:";
		cin >> n;
		switch (n) {
		case '1'://创建二叉树
			tree=creat();
			cout << "创建二叉树成功!" << endl;
			break;
		case '2'://中序遍历(递归)
			cout << "该二叉树的中序遍历(递归)结果为:";
			m_traverse(tree);
			cout << "\n";
			break;
		case '3'://先序遍历
			cout << "该二叉树的先序遍历结果为:";
			f_traverse(tree);
			cout << "\n";
			break;
		case '4'://后序遍历
			cout << "该二叉树的后序遍历结果为:";
			b_traverse(tree);
			cout << "\n";
			break;
		case '5'://中序遍历(非递归)
			cout << "该二叉树的中序遍历(非递归)结果为:";
			mm_traverse(tree);
			cout << "\n";
			break;
		case '6'://层序遍历
			cout << "该二叉树的层序遍历结果为:";
			c_traverse(tree);
			cout << "\n";
			break;
		case '7'://高度
			cout<<"该二叉树的高度为;"<<layer(tree);
			cout << "\n";
			break;
		case '8'://结点
			Node(tree);
			cout << "该二叉树的结点个数为:" << node << "\n";
			break;
		case '9'://叶子
			Leaf_Node(tree);
			cout <<"该二叉树的叶子个数为:"<< leaf_node << "\n";
			break;
		case '0'://交换左右结点
			change_Node(tree);
			cout << "交换成功!" << endl;
			break;
		case 'q'://退出
			cout << "再见" << endl;
			return 0;
		default://输入不合法
			cout << "你的输入有问题,请重新输入" << endl;
			break;
		}
	}
}

写下这篇博客,不仅仅还是为了记录下自己的学习,更是希望能够帮助到别人。希望这篇博客对你学习二叉树的实现能有一定的帮助。

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值