二叉树——层序遍历
目录
实现层序遍历
判断是否为完全二叉树
实现层序遍历
除了先序遍历,中序遍历,后序遍历外,还可以对二叉树进行层序遍历。设二叉树的结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后再从上至下,从左至右的依次访问,这就是层序遍历。
实现层序遍历需要借助数据结构——队列。
队列里的结点是 指向二叉树结点的指针
上图两个做标记处,第二个我们可能还可以理解,第一个再加一个struct是否有点多余了呢?
其实不会,而且必须要加,因为:如果只写BTNode*,编译器是不认识的,因为我们的Queue.h中是没有包含Tree.h的,所以我们要加上struct来“声明”这是一个结构体指针。
看到这有人可能会问了,“哎,博主博主,那我加上一个头文件不就可以了吗?”
哈哈,答案当然是“不行❌”
为什么呢?请看下图:
void LevelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);printf("%c", top->data);QueuePop(&q);if(top->left!=NULL)QueuePush(&q, top->left);if (top->right != NULL)QueuePush(&q, top->right);}QueueDestroy(&q);
}
判断是否为完全二叉树
首先我们来认识一下什么是完全二叉树,完全二叉树首先是二叉树,所有的结点度都不超过2,除了最后一层其他层都是满的,最后一层不一定,但结点一定是从左到右依次填充的。
那怎么判断一棵二叉树是不是完全二叉树呢?
依旧队列。如下图:
bool BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);QueuePop(&q);if (top == NULL)break;QueuePush(&q, top->left);QueuePush(&q, top->right);}while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);QueuePop(&q);if (top){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;
}