首页 > 编程语言 >设计算法判断一棵树是否为完全二叉树--c++

设计算法判断一棵树是否为完全二叉树--c++

时间:2024-03-28 20:29:05浏览次数:24  
标签:lchild BiNode 结点 -- c++ bt 二叉树 rchild

【题目要求】

设计算法判断一棵树是否为完全二叉树。

【提示】

根据完全二叉树的定义可知:

1)如果一个结点有右孩子而没有左孩子,那么这棵树一定不是完全二叉树。

2)如果一个结点有左孩子,而没有右孩子,那么按照层序遍历的结果,这个结点之后的所有结点都是叶子结点,这棵树才是完全二叉树。

3)如果一个结点是叶子结点,那么按照层序遍历的结果,这个结点之后的所有结点都必须是叶子结点这棵树才是完全二叉树。

【测试样例】

【输入】

AB#D##C##

【输出】

层序遍历:ABCD

判断是否是完全二叉树:不是

题解代码

//借助队列用层序遍历实现
#include<iostream>
#include<queue>
using namespace std;
const int QUEUESIZE = 100;


struct BiNode {
	char data;
	BiNode* lchild, * rchild;
};
class BiTree
{
private:
	BiNode* root;
public:
	BiTree() { root = creat(root); }
	~BiTree() {
		release(root);
	}
	BiNode* getRoot() { return root; }
	BiNode* creat(BiNode* bt); //构造函数调用
	void release(BiNode* bt);  //析构函数调用,释放树的存储空间 
	void leverOrder(BiNode* bt);//层序遍历函数调用
	bool isCompleteBiTree(BiNode* bt);//判断是否为完全二叉树
};

BiNode* BiTree::creat(BiNode* bt)
{
	char ch;
	cin >> ch;

	if (ch == '#')
		bt = NULL;
	else
	{
		bt = new BiNode;
		bt->data = ch;
		bt->lchild = creat(bt->lchild);
		bt->rchild = creat(bt->rchild);

	}
	return bt;
}

void BiTree::release(BiNode* bt)
{
	if (bt != NULL)
	{
		release(bt->lchild);
		release(bt->rchild);
		// cout<<"delete "<<bt->data<<endl;
		delete bt;
	}
}
void BiTree::leverOrder(BiNode* bt)
{
	BiNode* q;
	queue<BiNode*> Q;
	Q.push(root);
	if (root == NULL)
		return;
	while (!Q.empty())
	{
		q = Q.front();
		cout << q->data;
		Q.pop();
		if (q->lchild != NULL)
			Q.push(q->lchild);
		if (q->rchild != NULL)
			Q.push(q->rchild);
	}
}
bool BiTree::isCompleteBiTree(BiNode* bt)
{
	if (bt == NULL)
		return true;
	queue<BiNode*> Q;
	Q.push(bt);
	bool flag = false;
	while (!Q.empty())
	{
		BiNode* node = Q.front();
		Q.pop();
		if (node->lchild)  //如果左孩子存在
		{
			if (flag)     //但是前面有缺失的结点
				return false; //不是完全二叉树
			else          //前面是结点是满的
				Q.push(node->lchild); //把左孩子入队
		}
		else
		{
			flag = true;  //左孩子结点缺失,为了下一次判断需要将flag定为真
		}
		if (node->rchild) //右孩子结点存在
		{
			if (flag)     //前面有缺失的结点
				return false;//不是完全二叉树
			else
				Q.push(node->rchild);//否则,右孩子入队
		}
		else
			flag = true;//右孩子结点缺失,为了下一次判断需要将flag定为真
	}
	return true;
}
int main() {
	BiTree tree;
	cout << "层序遍历:";
	tree.leverOrder(tree.getRoot());
	cout << endl;
	cout << "判断是否是完全二叉树:";
	if (tree.isCompleteBiTree(tree.getRoot()))
		cout << "是" << endl;
	else
		cout << "不是" << endl;

	return 0;
}

标签:lchild,BiNode,结点,--,c++,bt,二叉树,rchild
From: https://blog.csdn.net/2301_79790771/article/details/137085029

相关文章

  • 会出价,才是一个投手最大的底气
    ECPM公式,最重要的一个因素,也是排在公式最前面的就是出价先有合适的出价,才有后面点击率/转化率从出价就能看出一个投手基础能力的强弱如何理解出价背后的含义,不局限于一个简单的数字关于出价深层的含义,今天来聊聊1:出的合适不2:时机对不对3:判断准不准4:系统知道吗一:......
  • 人工智能复试考察要点
    什么是人工智能人工智能是计算机科学的一个重要分支.也是一门正在发展中的综合性前沿学科,它是由计算机科学、控制论、信息论、神经生理学、哲学、语言学等多种学科相互渗透而发展起来的,目前正处于发展阶段尚未形成完整休系。人工智能三大学派——符号、连接、行为合取析取最......
  • Django框架之Django的安装与使用
    首先我们需要先确定好自己电脑上的python解释器环境,否则会导致后面项目所需要的库安装不了以及项目无法运行的问题。一、Django框架下载要下载Django并开始使用它,你可以按照以下步骤进行:1、安装Python首先,确保你的计算机上已经安装了Python。你可以从Python官方网站下载最......
  • 【节选 转载】人形机器人Optimus擎天柱技术解析
    参考原文:https://www.sohu.com/a/589454391_383324?scm=9010.8000.0.0.1265可以利用动作捕捉“学习”人类动作,依靠视觉的AI算法和学习,机器人能知道手在空间的位置,并准确拿取物品。Optimus擎天柱感知世界的方式和人类一样,都是视觉。可以看到,不同的物体被以不同的颜色......
  • flutter加载网络图片错误EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE The following
    在flutter里使用image.network加载网络图片遇到错误══╡EXCEPTIONCAUGHTBYIMAGERESOURCESERVICE╞════════════════════════════════════════════════════ThefollowingSocketExceptionwasthrownresolvingani......
  • SAT中的 width-based algorithm
    文献: KnotPipatsrisawat, AdnanDarwiche:Width-Based Restart PoliciesforClause-Learning Satisfiability Solvers. SAT 2009: 341-355 @inproceedings{DBLP:conf/sat/PipatsrisawatD09,author={KnotPipatsrisawatand......
  • ansible脚本
    -hosts:allgather_facts:nobecome:yestasks:-name:Installtraceroutepackage:name:"{{item}}"state:presentwith_items:-traceroute-name:checkipshell:"{{item}}"register:......
  • 状压 dp
    引入先看一道例题:(可能r18)有\(N\)个男生和\(N\)个女生。小A喜欢磕CP,现在小A想要磕\(N\)对CP。不过每一个人都有自己的npy,也不是随随便便就能磕成一对。现在小A找到了你,要你求出有多少种磕CP的方式。我们显然可以暴力枚举每一个男生跟谁组CP然后判断是否合法......
  • React — 原理面试题-持续更新
    1.什么是React事件,什么是原生事件?两者的区别在哪儿?React事件:React事件是经过封装和合成的,以保证在不同浏览器上的一致性。在使用React中的事件处理时,你会给JSX元素添加事件处理函数,比如onClick、onChange等,然后在事件处理函数中处理相应的逻辑。React事件的处理方式......
  • Golang操作kafka遇到网络问题重试的案例
    草稿0、实际中会遇到网络抖动会导致消费者有一小段时间与kafka连接遇到问题~0、如何模拟网络问题?本地跑多个kafka实例直接关掉其中一个kafka服务??怎么模拟断网??1、kafka-go与sarama都演示一下2、一个consumer消费一个topic的例子;模拟网络问题可以把kafka服务关了~观察一下再开启k......