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

  二叉树中有一个知识点就是完全二叉树,先介绍一下什么是完全二叉树。

 

我们之前所用的二叉树就是完全二叉树

若设二叉树的深度为h,除第h 层外,其它各层(1h-1)的结点数都达到最大个数,第 h层所有的结点都连续集中在最左边,这就是完全二叉树。

 

将这颗树的4结点去掉这棵树就不再是完全二叉树。

如何通过程序来判断某一颗树是不是完全二叉树呢?其实通过上边对完全二叉树的定义也能够很容易的想到,可以通过层序遍历的程序来修改后,判断当前树是不是完全二叉树。因为如果这棵树是完全二叉树那说明这个二叉树在进行层序遍历的时候在输出完这棵树之前不会有其他的NULL值,如果在层序遍历的时候,树还没有完全遍历完,就遇到了NULL,那就说明这棵树不是完全二叉树。

 https://blog.csdn.net/Hanani_Jia/article/details/79968615  如果对层序遍历不了解的可以看我上一篇文章。

 这里只需要在层序遍历的基础上进行一点更改,这里拿上图来说,当你2出队列的时候会把它的左孩子右孩子不是空的那个入队列,但是在判断是不是完全二叉树的时候,就不需要判断,无论是不是NULL,你都要将你的数据压入队列,当前程序在出2的时候会将32的右孩子空全都放到队列中,然后继续程序,这时候和层序遍历一样,要开始出数据5,出5的时候同样要把它的左右孩子全都入到队列中一个是6一个是空,这时候继续进行,出3入两个空,直到出的那个元素是空的时候,就需要跳出这个while循环,这时候队列内还是有元素的,但是如果你是完全二叉树的话就会发现此时的队列中即使有数据也都全是NULL,但是如果出现一个不是NULL的元素那就代表着当前树不是完全二叉树。

 

我就不一张一张图的解释这个过程了,但是这个图也是可以看出来过程的,用绿色的线划掉的代表出了队列,在出队列的同时将他的左右孩子直接入队列。N代表着是NULL,当遇到第一个N的时候就直接跳出循环,然后这时候要判断队内剩下的元素,也就是

 

6开始往上的是不是都是空如果都是空那就代表着这个树是完全二叉树否则就不是。

 

int IsCompleteBTree(BTNode* root)

{

if (root == NULL)

return 1;

Queue* BTree = NULL;

BTNode* Bt;

BTree = CreateQueue();

Queuepush(BTree, root);

while (Queuesize(BTree) != 0)

{

 Bt=QueuePop(BTree);

 if (Bt== NULL)

 break;

Queuepush(BTree, Bt->_left);

Queuepush(BTree, Bt->_right);

 

}

while (Queuesize(BTree) != 0)

{

Bt = QueuePop(BTree);

if (Bt != NULL)

return 0;

}

return 1;

}

 


同样还有一种思路来解决这个问题就是通过一个标志来判断,因为之前说过,如果你当前某个不为空的数据前边有一个空的数据那就说明你这个树他就不是完全二叉树,那怎么才能知道我这个数据前边有没有空值呢?所以这时候就需要做一个标志,初始的时候你的标志为0,每次在出元素之前判断一下,如果你当前元素不是NULL,那就需要判断一下他前边有没有NULL,初始flag就是0说明0代表着前边没有NULL,所以如果你的flag是0说明前边没有空元素,所以当你遇到空元素的时候就需要把你的flag变成别的值这里我把它变成了1,。

int IsCompleteBTree1(BTNode* root) // flag的方式判断

{

int flag = 0;

if (root == NULL)

return 1;//这里我将空树认为成完全二叉树

Queue* BTree = NULL;

BTNode* Bt;

BTree = CreateQueue();

Queuepush(BTree, root);

while (Queuesize(BTree) != 0)

{

Bt = QueuePop(BTree);

if (Bt != NULL)

{

Queuepush(BTree, Bt->_left);

Queuepush(BTree, Bt->_right);
if (flag == 1)return 0;}else{ flag = 1;} }return 1;}


这里两个函数都已经成功判断出你树是否是完全二叉树。

猜你喜欢

转载自blog.csdn.net/hanani_jia/article/details/80025475