判断一棵二叉树是不是完全二叉树

本文介绍了一种通过遍历二叉树节点来判断其是否为完全二叉树的算法。该算法使用队列实现广度优先搜索,并标记第一个度不为2的节点之后的所有节点。若标记后仍有节点存在子节点,则该二叉树不是完全二叉树。

判断是否是完全二叉树:找到第一个度不为2的节点标记起来,如果后面的节点还有孩子则不是完全二叉树

bool _IsCompleteBinaryTree(Node* _pRoot)
	{
		if (_pRoot == NULL)
			return true;

		Node* pCur = _pRoot;
		if ((pCur->_pLeft == NULL) && (pCur->_pRight == NULL))
			return true;

		queue<Node*> q;
		q.push(pCur);
		bool flag = false;
		size_t count = 0;

		while (!q.empty())
		{
			Node* front = q.front();
			if ((front != NULL) && ((front->_pLeft) || (front->_pRight)))
			{
				q.push(front->_pLeft);
				q.push(front->_pRight);
			}

			q.pop();

			if (front == NULL)
			{
				flag = true;
				count++;
			}
			else
			{
				if (count == 1)
				{
					flag = false;
					break;
				}
				else
					flag = false;
			}
		}
		if (flag == false)
			return false;
		else
			return true;

	}


### 判断一棵二叉树是否完全二叉树的算法 判断一棵二叉树是否完全二叉树,可以通过层次遍历的方法实现。以下是详细的算法描述和代码实现: #### 算法描述 采用层次遍历的方式,将所有节点按顺序加入队列中(包括空节点)。当遇到第一个空节点时,检查其后是否存在非空节点。如果存在,则说明该二叉树不是完全二叉树[^4]。 #### 代码实现 以下是一个基于C语言的实现示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建新节点 TreeNode* createNode(int data) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } // 队列结构定义 typedef struct Queue { int front, rear, size; unsigned capacity; TreeNode** array; } Queue; // 创建队列 Queue* createQueue(unsigned capacity) { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->capacity = capacity; queue->front = queue->size = 0; queue->rear = capacity - 1; queue->array = (TreeNode**)malloc(queue->capacity * sizeof(TreeNode*)); return queue; } // 检查队列是否为空 int isEmpty(Queue* queue) { return queue->size == 0; } // 入队操作 void enqueue(Queue* queue, TreeNode* item) { if (queue->size == queue->capacity) { printf("Overflow\n"); return; } queue->rear = (queue->rear + 1) % queue->capacity; queue->array[queue->rear] = item; queue->size++; } // 出队操作 TreeNode* dequeue(Queue* queue) { if (isEmpty(queue)) return NULL; TreeNode* item = queue->array[queue->front]; queue->front = (queue->front + 1) % queue->capacity; queue->size--; return item; } // 判断是否完全二叉树 int isCompleteBinaryTree(TreeNode* root) { if (root == NULL) return 1; // 空树是完全二叉树 Queue* queue = createQueue(100); // 假设最大容量为100 enqueue(queue, root); int flag = 0; // 标记是否遇到过空节点 while (!isEmpty(queue)) { TreeNode* temp = dequeue(queue); if (temp->left) { if (flag == 1) return 0; // 如果已经遇到过空节点,又出现非空左子节点,则不是完全二叉树 enqueue(queue, temp->left); } else { flag = 1; // 遇到空节点,标记为1 } if (temp->right) { if (flag == 1) return 0; // 如果已经遇到过空节点,又出现非空右子节点,则不是完全二叉树 enqueue(queue, temp->right); } else { flag = 1; // 遇到空节点,标记为1 } } return 1; // 所有条件都满足,是完全二叉树 } ``` #### 算法复杂度分析 - 时间复杂度:O(n),其中n为二叉树中的节点数。每个节点都需要访问一次。 - 空间复杂度:O(n),在最坏情况下,队列可能需要存储所有节点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值