各位老友,欢迎来到本期博文!本期将继续进行二叉树的学习!!
本期涉及内容包括 :> 二叉树层序遍历,布尔判断二叉树(是不是二叉树)
那么重点来了,我们该如何实现 层序遍历!以及什么是层序遍历!?
-----> 层序遍历:自根至叶子结点(自上而下)每一层每一层遍历打印,而每一层的遍历又是从子左子树到右子树
那么,该如何实现呢!
------> 其实,接下来写的是用队列来实现的!如此,队列的作用就派上了用场,队列遵循先进先出!
其实,用队列去实现层序遍历是最常用的,也是最为高效的!!
而在代码逻辑上是最为清晰的,有章可循的,至少在一定程度上,降低了用其他方法带来的冗长与赘余!!
注意,这里不再展示队列书写!!请老友们自行观看,前几期的博文!
现在上手代码 :>
//二叉树层序遍历
#include "Queue.h"
void TreeLevel(BTNode* root)
{
Queue q;
QueueInitial(&q);
if(root)
{
QueuePush(&q, root);
}
while(!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
printf("%d ", front ->data);
if(front ->leftChild)
{
QueuePush(&q, front ->leftChild);
}
if(front ->rightBrother)
{
QueuePush(&q, front ->rightBrother);
}
}
QueueDestroy(&q);
}
为了方便各位老友有较好的观感体验!!
现在,继续推进!该如何实现布尔判断二叉树?
答案是,队列!至于缘由,还是在比较了各种方法之间,队列的布尔判断是最高效,也是代码逻辑最为简洁明了的!!哈😊老友们,我说了一句官话!!其真相是老师说的!!
现在就上手代码了!高能来袭😊😊
#include "Queue.h"
//布尔判断二叉树
bool TreeComplet(BTNode* root)
{
Queue q;
QueueInitial(&q);
if(root)
QueuePush(&q, root);
while(!QueueEmpty(&q))
{
BTNode* Front = QueueFront(&q);
QueuePop(&q);
if(Front == NULL)
break;
else
{
QueuePush(&q, Front ->leftChild);
QueuePush(&q, Front ->rightBrother);
}
}
while(!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
if(front)
{
QueueDestroy(&q);
return false;
}
}
QueueDestroy(&q);
return true;
}
现在附上有色彩观感的代码图样如下:
各位好友,上述代码,真正难以理解的是以下部分 :>
而这是布尔判断二叉树中最为核心和精华的所在!!
为了方便理解与掌握!以下会附上图示样解进行解说!关键是怎么思考与其突破点在哪里?
请注意看红色区域,在这里,是否为完全二叉树,所依据的核心便在这里了!
而在最终,不知老友们注意到没有!申请的空间(malloc)是要归还和释放掉的,是为了防止内存泄露!!
一般对结点进行申请开辟空间之后,最后别忘了进行 Free 好习惯的养成,更能体现一名程序员的基本素养,规范,以及逻辑上更加严谨!!
现在上手代码操作,销毁二叉树
//销毁二叉树
void TreeDestroy(BTNode* root)
{
if(root == NULL)
{
return ;
}
//还是运用了强大的递归
TreeDestroy(root ->leftChild);
TreeDestroy(root ->rightBrother);
free(root);
}
以上,就是本期的内容了!!希望各位老友,能有收获!
感谢阅读!!我们下一期见😊😊