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

题目:判断一棵二叉树是否是完全二叉树

思路:

1.首先明确完全二叉树的概念。完全二叉树除最后一层外,所有层结点数均达到最大值,最后一层结点连续集中在最左边。空树也是完全二叉树。

2.我们可以通过层序遍历的方式遍历这个二叉树,使用一个队列存储遍历的结点。可以利用最后一层的结点集中在左侧这个特性解题,具体看代码:

代码:

bool isCompleteTree(pTree pT)
{
	Queue q;
	initQueue(&q);
	Enqueue(&q,pT);//根入队
	pNode ptr = NULL;
	while((ptr = Dequeue(&q)) != NULL)//不断出队,直到遇到空
	{
		Enqueue(&q,ptr->left);//入队左孩子,空结点也同样入队
		Enqueue(&q,ptr->right);//入队右孩子
	}
	while(!isQueueEmpty(&q))//如果队列非空,那么留在队列中的必然都是NULL结点
	{
		ptr = Dequeue(&q);
		if(ptr != NULL)//如果存在非null结点,说明不是完全二叉树
		{
			return false;
		}
	}
	return true;
}

完整代码:

/*
判断是否是完全二叉树
by Rowandjj
2014/8/19
*/
#include<iostream>
using namespace std;
typedef struct _NODE_
{
	int data;
	struct _NODE_ *left;
	struct _NODE_ *right;
}Node,*pNode,*pTree;
typedef struct _QUEUENODE_
{
	pNode queue_data;
	struct _QUEUENODE_ *next;
}QueueNode,*pQueueNode;
typedef struct _QUEUE_
{
	pQueueNode pHead;
	pQueueNode pTail;
	int size;
}Queue,*pQueue;
void initQueue(pQueue pQ)
{
	pQ->pHead = pQ->pTail = (pQueueNode)malloc(sizeof(QueueNode));
	if(!pQ->pTail)
	{
		exit(-1);
	}
	pQ->pHead->next = NULL;
	pQ->size = 0;
}
void Enqueue(pQueue pQ,pNode data)
{
	if(pQ == NULL)
	{
		return;
	}
	pQueueNode pNew = (pQueueNode)malloc(sizeof(QueueNode));
	if(!pNew)
	{
		exit(-1);
	}
	pNew->queue_data = data;
	pNew->next = NULL;
	pQ->pTail->next = pNew;
	pQ->pTail = pNew;
	pQ->size++;
}
pNode Dequeue(pQueue pQ)
{
	if(pQ == NULL)
	{
		return NULL;
	}
	pQueueNode pDel = pQ->pHead->next;
	if(pDel == NULL)
	{
		return NULL;
	}else
	{
		pNode result = pDel->queue_data;
		if(pQ->pTail == pDel)
		{
			pQ->pTail = pQ->pHead;
		}
		pQ->pHead->next = pDel->next;
		pQ->size--;
		free(pDel);
		return result;
	}
}
bool isQueueEmpty(pQueue pQ)
{
	return pQ->size == 0;
}
bool isCompleteTree(pTree pT)
{
	Queue q;
	initQueue(&q);
	Enqueue(&q,pT);
	pNode ptr = NULL;
	while((ptr = Dequeue(&q)) != NULL)
	{
		Enqueue(&q,ptr->left);
		Enqueue(&q,ptr->right);
	}
	while(!isQueueEmpty(&q))
	{
		ptr = Dequeue(&q);
		if(ptr != NULL)
		{
			return false;
		}
	}
	return true;
}
void createTree(pTree *pRoot)
{
	int data;
	cin>>data;
	if(data == -1)
	{
		return;
	}
	*pRoot = (pNode)malloc(sizeof(Node));
	if(*pRoot == NULL)
	{
		exit(-1);
	}
	(*pRoot)->data = data;
	(*pRoot)->left = NULL;
	(*pRoot)->right = NULL;
	createTree(&(*pRoot)->left);
	createTree(&(*pRoot)->right);
}
void displayTree(pTree pT)
{
	if(pT == NULL)
	{
		return;
	}
	cout<<pT->data<<" ";
	if(pT->left)
	{
		displayTree(pT->left);
	}
	if(pT->right)
	{
		displayTree(pT->right);
	}
}
int main()
{
	pTree p = NULL;
	createTree(&p);
	cout<<isCompleteTree(p)<<endl;
	displayTree(p);
	cout<<endl;
	return 0;
}

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

时间: 2024-10-11 11:54:55

判断一棵二叉树是否是完全二叉树的相关文章

判断一棵二叉树是不是平衡二叉树

二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 两种解法. 第一种:菜鸟的解法,出现重复遍历,时间复杂度高. 1 bool IsBalanced(BinaryTreeNode* root) 2 { 3 if (root == NULL) 4 { 5 return true ; 6 } 7 int left = TreeDepth(root->m_pLeft);//该函数实现见我上一篇博客"数的深度" 8 int right = TreeDepth(root-&

编程实现判断一棵二叉树是否是平衡二叉树

Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 思路:遍历这棵二叉树,每访问

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

判断一棵二叉树是否为BST,一棵树是否为完全二叉树

对于一颗搜索二叉树,最简单的方法就是用中序遍历,看是不是一个递增数列,如果是则是一颗搜索二叉树,如果不是则不是搜索二叉树.在这里用一个lastVisit去记录上一次搜索到的节点.整个过程就是先找到最左下角的节点,更新这个lastVisit为这个节点的值,然后按照中序遍历依次更新即可.代码如下. 1 #include <stdio.h> 2 #include <climits> 3 4 //二叉树结点 5 typedef struct binary_tree_node_t{ 6 bi

如何判断一棵二叉树是完全二叉树

完全二叉树(Complete Binary Tree): 设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树. 解析: 任意的一个二叉树,都可以补成一个满二叉树.这样中间就会有很多空洞.在广度优先遍历的时候,如果是满二叉树,或者完全二叉树,这些空洞是在广度优先的遍历的末尾,所以,但我们遍历到空洞的时候,整个二叉树就已经遍历完成了.而如果,是非完全二叉树, 我们遍历到空洞的时候,就会发现,空洞后面还有没有遍历到

判断一棵树是否为完全二叉树

完全二叉树:若一棵二叉树具有具有n个节点,它的每个节点都与高度为k的满二叉树编号为0~n-1结点一一对应,则称这可二叉树为完全二叉树. 方法一:一维数组存储 根据完全二叉树的定义和性质,利用一位数组作为完全二叉树的存储,如下图 由图,节点的编号与数组元素的下标是一一对应的,可根据二叉树的性质,可方便找出下标 为i的的双亲结点a[i/2]及左右孩子结点a[i*2],a[i*2+1].这样判断一棵树是否为二叉树,应该对此二叉树从上到下,从左到右依次编号, 然后把编好的号依次存入一位数组中,在与相应深

【面试】判断一棵二叉树是否为二叉排序树

一.描述 给定一棵二叉树,如何判断一棵树是否是二叉排序树.给出树结点定义如下 class TreeNode { int key; TreeNode left; TreeNode right; public TreeNode(int key) { this.key = key; } } 二.解题思路 根据二叉排序树的性质,在进行中序遍历的时候,当前结点的值总是大于前驱结点的值,需要在遍历时保存前驱结点的值,这样有利于进行判断,基于这样的思路来进行解题. 三.代码 根据以上的解题思路(遍历时利用二叉

剑指Offer--040-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]

链接 牛客OJ:平衡二叉树 九度OJ:未收录 GitHub代码: 040-平衡二叉树 CSDN题解:剑指Offer–040-平衡二叉树 牛客OJ 九度OJ CSDN题解 GitHub代码 040-平衡二叉树 未收录 剑指Offer–040-平衡二叉树 040-平衡二叉树 题意 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 递归法 根据平衡二叉树的定义 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1 因此我们递归的判断每一个根节点,判断左右子树的高度差 递归得到二叉

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

//叶子节点的个数 /* (1)如果二叉树为空,返回0 (2)如果二叉树不为空且左右子树为空,返回1 (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 */ int GetLeafNodeNum(BTree* root) { if(root == NULL) return 0; if(root->m_pLeft == NULL && root->m_pRight == NULL) return 1; int LeafNumOfLef