数据结构--二叉树相关习题5(判断二叉树是否是完全二叉树 )

1.判断二叉树是否是完全二叉树 

辨别:

不能使用递归或者算节点个数和高度来判断。

满二叉树可以用高度和节点来判断,因为是完整的。

但是完全二叉树前面是满的,但是最后一层是从左到右连续这种

如果仍然用这种方法的话,如下图两个识别方法是一样的,但是无法准确识别

完全二叉树:前h-1层是满的,最后一层是从左到右连续。

如果走层序那么一定是连续的,也就是说要通过层序遍历来走。

思路:1.层序遍历走,空也进序列。

2.遇到第一个空时开始判断,如果后面都为空则是完全二叉树,若空后面还出席那非空的情况则说明不是完全二叉树。

代码实现:

//判断二叉树是否是完全二叉树
bool TreeComplete(BTNode* root)
{ 
	Queue q;//仍然使用队列去实现
	QueueInit(&q);
	if (root)
	 QueuePush(&q,root)
		while (!QueueEmpty)
		{
			BTNode* front = QueueFront(&q);
			QueuePop(&q);
			//遇到第一个空就可以开始判断,如果队列中还有非空,就不是完全二叉树。
			if (front == NULL)
			{
				break;
			}
			QueuePush(&q, front->left);
			QueuePush(&q, front->right);
     }
	while (!QueueEmpty)
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		
		//如果仍有非空元素,直接
//		return false;

		if (front)
		{
			QueueDestroy(&q);//如果存在非空。
				return false;
		}
		QueueDestroy(&q);
		return true;
//最终QueueDestroy,再返回
	}
}

补充队列的一系列实现

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead =  NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);

		cur = next;
	}

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

// 队尾插入
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}

	newnode->next = NULL;
	newnode->val = x;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}

	pq->size++;
}

// 队头删除
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);

	/*QNode* next = pq->phead->next;
	free(pq->phead);
	pq->phead = next;

	if (pq->phead == NULL)
		pq->ptail = NULL;*/

		// 一个节点
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else // 多个节点
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}

	pq->size--;
}

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);

	return pq->phead->val;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->ptail);

	return pq->ptail->val;
}


int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}
//判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

相关推荐

  1. 数据结构与算法】判断是否完全

    2024-07-10 11:28:09       33 阅读
  2. 相关

    2024-07-10 11:28:09       17 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 11:28:09       4 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 11:28:09       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 11:28:09       4 阅读
  4. Python语言-面向对象

    2024-07-10 11:28:09       4 阅读

热门阅读

  1. 定制化正则化:在Mojo模型中动态应用自定义方法

    2024-07-10 11:28:09       11 阅读
  2. 稀疏之美:在Mojo模型中实现特征的稀疏表示

    2024-07-10 11:28:09       11 阅读
  3. AI开发者的编程语言Mojo:入门指南

    2024-07-10 11:28:09       11 阅读
  4. 跨语言的智能:在多种编程环境中部署Mojo模型

    2024-07-10 11:28:09       10 阅读
  5. Mojo编程语言详细介绍

    2024-07-10 11:28:09       11 阅读
  6. 掌握MOJO命令行:参数解析的艺术

    2024-07-10 11:28:09       12 阅读
  7. 运营商二三要素是什么?有什么意义

    2024-07-10 11:28:09       8 阅读
  8. 3102. 最小化曼哈顿距离

    2024-07-10 11:28:09       8 阅读
  9. PHP String manipulation: A comprehensive guide

    2024-07-10 11:28:09       8 阅读
  10. Qt5 Ubuntu18 QStackedWidget

    2024-07-10 11:28:09       10 阅读
  11. WebKit源代码探秘:深入理解其组织结构与组件

    2024-07-10 11:28:09       10 阅读
  12. 【回溯+双指针算法题记录】回文字符串汇总

    2024-07-10 11:28:09       7 阅读
  13. 2288. 价格减免

    2024-07-10 11:28:09       10 阅读
  14. Quartz 介绍

    2024-07-10 11:28:09       6 阅读
  15. Taro自定义实现本地路径转换为文件

    2024-07-10 11:28:09       7 阅读