一 . 我们的大概思路
树的层次遍历,按照一层一层的进行遍历。
那么我们要怎么实现这个功能呢?
我们在之前学过一个数据结构,叫做队列,我们来试一下,它们配合一下,看看是否可以完成这个功能。
我们发现,用队列似乎是可以完成这个功能的,那么我们来操作一下。
二 代码实现
2.1 层次遍历
我们先完成一些头文件和结构体的创建。
我们借用一些队列的操作。
可以通过malloc先创建一个节点,然后让这个节点指向我们树的根节点,然后再让ps->head指向这个新创建的节点,通过移动这个队列指针来实现我们的层次遍历,我们先把根节点打印了出来,然后把它的左右孩子放入队列,然后再让头指针移动到根节点的左孩子,把它的左右孩子放入我们的队列,然后又指向了根节点的右孩子,最后通过队列实现了层次遍历。
就是这样,实现了层次遍历。
2.2 判断是否为完全二叉树
首先我们要了解什么是完全二叉树,完全二叉树就是前n-1层是满二叉树,最后一层从左至右不间断,这样的二叉树就是完全二叉树。
我们要怎么实现呢?
通过上面的层次遍历也给我了启发,只要出现了NULL,把它放入队列中,那么队列后面的元素全都要是NULL,否则就不是完全二叉树。
就是这个样子。我们可以来模拟一下它的过程。
还是开始我们先让ps->head和ps->tail都指向树的根节点,我们上面的层次遍历是队列里面不放入NULL值,但是我们的这个就要放入NULL了,我们通过遍历放入,因为我们是按照层次遍历来放的,说明我们只要放入的元素出现了空值,说明后面的全为空,因为要从左到右不间断吗,所以中间就不能间断,所以后面全部都要是NULL才行,所以就有了第二个循环,发现不是NULL的直接返回false就行了。
我们以这颗树为例,先把A放入到队列中。
第一次我们把ABC放入到里面了,此时cur指向A节点。
这是第二次循环的结果,此时cur指向了B,A还在队列中,但是此时访问不到了,严谨一点的话我们可以,最后我们把他们全free就行了。
这是第三次的结果,此时cur指向C,此时A,B都访问不到了。
这是第四次的结果。
这是第五次的结果,此时指向了空,出了循环,进入了第二个循环,发现cur->next->tree!=NULL,所以它就不是一个完全二叉树。
当你访问到了第一个为NULL的节点的时候,此时队列中有的是与它同一层的后面的节点和与它同一层的前面的孩子节点,不包括自己的孩子节点,所以后面应该全为空的,才是完全二叉树。
三 .代码实现2
3.1层次遍历
也可以这样,再多实现队列的QueuePop功能,通过在这个函数里面创建一个队列,实现初始化和插入,通过QueueEmpty方法判断ps->head是否为空,然后通过QueueFront方法来获取到队列的第一个元素,通过QueuePop来移动ps->head指针,让它往后移动,也是分别把左右孩子放入队列,最后销毁队列。
3.2 判断是否为完全二叉树
这和我们上面的讲解差不多,就是它多使用了一些封装的方法来实现。
四.结束语
感谢大家的查看,希望可以帮助到大家,做的不是太好还请见谅,其中有什么不懂的可以留言询问,我都会一一回答。 感谢大家的一键三连。