数据结构与算法编程题31

news2024/11/27 8:23:39

判断给定二叉树是否是完全二叉树

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

typedef char ElemType;
#define ERROR 0
#define OK 1
#define Maxsize 100
#define STR_SIZE 1024

typedef struct BiTNode
{
	ElemType data;
	BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

void draw(BiTNode* root);

//-------------------------队列操作---------------------------//
typedef struct Queue
{
	BiTNode* data[Maxsize];
	int front;
	int rear;
}Queue;

void Init_Queue(Queue& Q)
{
	Q.front = Q.rear = 0;
}

bool Empty_Queue(Queue& Q)
{
	if (Q.front == Q.rear)
	{
		cout << "队列为空" << endl;;
		return OK;
	}
	return ERROR;
}

bool Enter_Queue(Queue& Q, BiTNode* x)
{
	if ((Q.rear + 1) % Maxsize == Q.front)
	{
		cout << "队列已满,无法继续入队!!!" << endl;
		return ERROR;
	}
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % Maxsize;
	return OK;
}

bool Leave_Queue(Queue& Q, BiTNode*& x)
{
	if (Q.rear == Q.front)
	{
		cout << "队列为空,无法出队!!!" << endl;
		return ERROR;
	}
	x = Q.data[Q.front];
	//cout << "出队元素为:" << x->data << endl;//
	Q.front = (Q.front + 1) % Maxsize;
	return OK;
}
//-------------------------队列操作---------------------------//

bool Create_tree(BiTree& T) //递归创建二叉树
{
	ElemType x = 0;
	cin >> x;
	if (x == '#')
	{
		T = NULL;
	}
	else
	{
		T = (BiTree)malloc(sizeof(BiTNode));
		if (T == NULL)
		{
			cout << "内存无法分配!!!" << endl;
			return ERROR;
		}
		T->data = x;
		T->lchild = NULL;
		T->rchild = NULL;
		Create_tree(T->lchild);
		Create_tree(T->rchild);
	}
	return OK;
}

void PreOrder(BiTree T)   //前序遍历非递归
{
	if (T != NULL)
	{
		cout << T->data;
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}

void InOrder(BiTree T)    //中序遍历非递归
{
	if (T != NULL)
	{
		InOrder(T->lchild);
		cout << T->data;
		InOrder(T->rchild);
	}
}

void PostOrder(BiTree T)  //后序遍历非递归
{
	if (T != NULL)
	{
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		cout << T->data;
	}
}

//---------------------------------核心代码---------------------------------//
bool judge_wanquan_bitree(BiTree T)
{
	if (T == NULL)
	{
		cout << "二叉树为空!!!" << endl;
		return ERROR;
	}
	Queue Q;
	Init_Queue(Q);
	BiTNode* p = T;
	Enter_Queue(Q, p);
	while (Empty_Queue(Q)!=OK)
	{
		Leave_Queue(Q, p);
		if (p != NULL)
		{
			Enter_Queue(Q, p->lchild);
			Enter_Queue(Q, p->rchild);
		}
		else
		{
			while (Empty_Queue(Q) != OK)
			{
				Leave_Queue(Q, p);
				if (p != NULL)
					return ERROR;
			}
		}
	}
	return OK;
}
//---------------------------------核心代码---------------------------------//

//判断给定二叉树是否是完全二叉树
//测试树1:124###3##
//测试树2:124###35###
int main(void)
{
	cout << "//------生成一颗树---------//" << endl;
	BiTree T = NULL;
	Create_tree(T);
	PreOrder(T);
	cout << endl;
	InOrder(T);
	cout << endl;
	PostOrder(T);
	cout << endl;
	cout << "//------生成一颗树---------//" << endl;
	cout << "//------原始树图形---------//" << endl;
	draw(T);
	cout<<"输入的二叉树是否为完全二叉树,1代表是,0代表不是:"<<judge_wanquan_bitree(T);
	return 0;
}

//参考博客:https://blog.csdn.net/weixin_42109012/article/details/92250160
/*****************************************************************************
* @date   2020/4/19
* @brief  水平画树
* @param  node	二叉树节点
* @param  left	判断左右
* @param  str 	可变字符串
*****************************************************************************/
void draw_level(BiTNode* node, bool left, char* str) {
	if (node->rchild) {
		draw_level(node->rchild, false, strcat(str, (left ? "|     " : "      ")));
	}

	printf("%s", str);
	printf("%c", (left ? '\\' : '/'));
	printf("-----");
	printf("%c\n", node->data);

	if (node->lchild) {
		draw_level(node->lchild, true, strcat(str, (left ? "      " : "|     ")));
	}
	//  "      " : "|     " 长度为 6
	str[strlen(str) - 6] = '\0';
}

/*****************************************************************************
* @date   2020/4/19
* @brief  根节点画树
* @param  root	二叉树根节点
*****************************************************************************/
void draw(BiTNode* root) {
	char str[STR_SIZE];
	memset(str, '\0', STR_SIZE);

	/**
	 * 1. 在 windows 下,下面是可执行的
	 * 2. 在 Linux   下,执行会报 Segmentation fault
	 *      需要使用中间变量
	 */
	if (root->rchild) {
		draw_level(root->rchild, false, str);
	}
	printf("%c\n", root->data);
	if (root->lchild) {
		draw_level(root->lchild, true, str);
	}
}

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

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

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

相关文章

160 相交链表

解题思路&#xff1a; \qquad 若两个链表a, b相交&#xff0c;则它们之间的区别就仅在于相交节点之前的部分&#xff08;其实任意两个链表最终都会相交&#xff0c;最坏相交于NULL节点&#xff09;。一开始的思路&#xff1a; \qquad\qquad\qquad 1、找到两个链表较长的那个&…

Linux基础项目开发1:量产工具——程序框架(一)

前言&#xff1a; 前面已经将Linux应用开发基础知识学习完了&#xff0c;现在让我们来做个小项目练练手&#xff0c;对之前的一些知识点进行一个更加具体详细的认识与了解&#xff0c;我们要进行的项目名称为&#xff1a;电子产品量产测试与烧写工具&#xff0c;这是一套软件&a…

车内总线通信技术简述

1. 前言 本文主要分享一些汽车总线通信技术&#xff08;CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet&#xff09;&#xff0c;希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN&#xff08;Controller Area Network&#xff09;全称为“控制器局域…

priority_queue模拟实现

目录 仿函数 模拟实现 结果 大根堆 小根堆 完整代码 priority_queue.h test.c 仿函数 仿函数的通俗定义&#xff1a;仿函数&#xff08;functor&#xff09;又称为函数对象&#xff08;function object&#xff09;是一个能行使函数功能 的类。仿函数的语法几乎和我们…

【力扣】56. 合并区间

【力扣】56. 合并区间 文章目录 【力扣】56. 合并区间1. 题目介绍2. 解法2.1 方法一&#xff1a;标志位2.2 方法二&#xff1a;排序 遍历 3. Danger参考 1. 题目介绍 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合…

myAGV 2023 Pi 全新升级!

Introduction 在高速发展的自动化和机器人技术领域&#xff0c;我们的公司一直致力于提供高效、灵活且可靠的轻量级机械臂解决方案。然而&#xff0c;我们也深知&#xff0c;传统的机械臂需要固定在一个地方&#xff0c;这在一定程度上限制了其在空间上的应用范围。为了突破这一…

Error opening terminal: xterm.”的解决方法

主要是看下面这两个变量是否设置正确 $ echo $TERM $ echo $TERMINFO 通常TERM的默认值为xterm-265color, 要查看支持的term&#xff0c;可以ls -al /lib/terminfo/x/ 如果TERM是xterm-265color的话&#xff0c;TERMINFO设置为/usr/lib/terminfo make menuconfig时提示“Err…

阿里元境亮相第八届世界物联网大会,分享元计算对数字文旅的创新赋能

2023&#xff08;第八届&#xff09;世界物联网大会于11月20日在中国北京隆重开幕。联合国秘书长安东尼奥古特雷斯在开幕式发表书面致辞时特别提到&#xff1a;“在一个相互连接的世界&#xff0c;你们的主题‘新物联、新经济、新时代’是数字技术影响力的见证”。 11月21日上午…

HCIA-H12-811题目解析(1)

1、【多选题】关于动态 MAC 地址表说法正确的是&#xff1f; A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数&#xff0c;可以获取接口下通信的用户数 C、在设备重启后&#xff0c;之前的动态表项会丢失 D、在设备重启后&…

Unity性能优化技巧篇

资源导入优化 随着项目越来越大&#xff0c;资源越来越多&#xff0c;有一套资源导入自动化设置很有必要&#xff0c;它不但可以减少你的工作量&#xff0c;也能更好的统一管理资源&#xff0c;保证资源的导入设置最优&#xff0c;还不会出错。 AssetPostprocessor 在Unity中…

【Java从入门到大牛】Java高级技术

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年11月27日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f4…

探索 V8 引擎的内部:深入理解 JavaScript 执行的本质

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

nodejs+vue+mysql皮具行李箱包包网上商城购物网站

本系统可分为两个大的模块&#xff0c;即前台用户模块和后台管理员模块&#xff0c;前台用户模块用户可以进行浏览查询皮具的各种信息&#xff0c;添加购物车&#xff0c;下订单等各种操作。后台管理员模块管理员可以进行皮具的处理&#xff0c;还有处理订单&#xff0c;皮具分…

数据结构--->单链表

文章目录 链表链表的分类 单链表单链表的存储结构单链表主要实现的接口函数单链表尾插动态申请新节点单链表头插单链表的尾删单链表的头删在指定位置之前插入单链表查找插入 在指定位置之后插删除指定位置元素删除指定位置之后的元素顺序输出链表销毁单链表 顺序表和单链表的区…

excel单元格内换行按什么快捷键

如果我们使用excel软件的时候&#xff0c;因为一些日常的操作太过繁琐想要简化自己的操作步骤的话&#xff0c;其实是有很多快捷方式在其中的。那么对excel单元格内换行按什么快捷键这个问题&#xff0c;据小编所知我们可以在表格中使用Alt Enter来进行换行。详细内容就来看下…

【云备份】数据管理模块

文章目录 1. 数据管理模块要管理什么数据&#xff1f;2. 数据管理模块如何管理数据&#xff1f;3. 数据管理模块的具体实现BackupInfo 数据信息类NewBackupInfo —— 获取各项属性信息 DataManager 数据管理类构造函数析构函数insert —— 新增update —— 修改GetOneByURL——…

C语言——标识符

一、标识符是什么 标识符是C程序的最基本组成部分&#xff0c;例如&#xff1a;变量名称、函数名称、数据类型等等&#xff0c;都是一个标识符。标识符的要求是&#xff1a;必须由字母&#xff08;区分大小写&#xff09;、数字、下划线组成。而且&#xff0c;标识符的第一个字…

JDBC编程基础

JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端&#xff0c;自己…

SQL Server:流程控制语言详解

文章目录 一、批处理、脚本和变量局部变量和全局变量1、局部变量2、全局变量 二、顺序、分支和循环结构语句1、程序注释语句2、BEGIN┅END语句块3、IF┅ELSE语句4、CASE语句5、WHILE语句6、BREAK和CONTINUE语句BREAK语句CONTINUE语句 三、程序返回、屏幕显示等语句1、RETURN语句…