0
点赞
收藏
分享

微信扫一扫

数据结构-->二叉树_03

各位老友,欢迎来到本期博文!本期将继续进行二叉树的学习!!

本期涉及内容包括 :> 二叉树层序遍历,布尔判断二叉树(是不是二叉树)

那么重点来了,我们该如何实现 层序遍历!以及什么是层序遍历!?

-----> 层序遍历:自根至叶子结点(自上而下)每一层每一层遍历打印,而每一层的遍历又是从子左子树到右子树

那么,该如何实现呢!

------> 其实,接下来写的是用队列来实现的!如此,队列的作用就派上了用场,队列遵循先进先出!

其实,用队列去实现层序遍历是最常用的,也是最为高效的!!

而在代码逻辑上是最为清晰的,有章可循的,至少在一定程度上,降低了用其他方法带来的冗长与赘余!!

注意,这里不再展示队列书写!!请老友们自行观看,前几期的博文!

现在上手代码 :>

//二叉树层序遍历
#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);
}

为了方便各位老友有较好的观感体验!!

数据结构-->二叉树_03_布尔判断二叉树


现在,继续推进!该如何实现布尔判断二叉树?

答案是,队列!至于缘由,还是在比较了各种方法之间,队列的布尔判断是最高效,也是代码逻辑最为简洁明了的!!哈😊老友们,我说了一句官话!!其真相是老师说的!!

现在就上手代码了!高能来袭😊😊

#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;
}

现在附上有色彩观感的代码图样如下:

数据结构-->二叉树_03_层序遍历_02

各位好友,上述代码,真正难以理解的是以下部分 :>

数据结构-->二叉树_03_层序遍历_03

而这是布尔判断二叉树中最为核心和精华的所在!!

为了方便理解与掌握!以下会附上图示样解进行解说!关键是怎么思考与其突破点在哪里?

数据结构-->二叉树_03_层序遍历_04

请注意看红色区域,在这里,是否为完全二叉树,所依据的核心便在这里了!

而在最终,不知老友们注意到没有!申请的空间(malloc)是要归还和释放掉的,是为了防止内存泄露!!

一般对结点进行申请开辟空间之后,最后别忘了进行 Free 好习惯的养成,更能体现一名程序员的基本素养,规范,以及逻辑上更加严谨!!

现在上手代码操作,销毁二叉树

//销毁二叉树
void TreeDestroy(BTNode* root)
{
	if(root == NULL)
  {
		return ;  
  }
  
  //还是运用了强大的递归
  TreeDestroy(root ->leftChild);
  TreeDestroy(root ->rightBrother);
  
  free(root);
}

以上,就是本期的内容了!!希望各位老友,能有收获!

感谢阅读!!我们下一期见😊😊


举报

相关推荐

0 条评论