今天我们来到了二叉树的最后一部分(当然只是对于初阶来说)~~~
目录
一、层序遍历(LevelOrder)
1、什么是层序遍历?
层序遍历其实就是 bfs ,也就是宽度优先搜索。意思就是一层一层横向地访问节点,而不是纵向访问。
2、实现思路
假设有这样一棵二叉树:
如果层序遍历它的话,那么结果应该是这样的:
而你看这个数组就不难发现:1 是第一层的数据;2 4 是第二层的数据;3 5 null 6 是第三层的数据;null 7 是第四层的数据...
而且,我们还发现,2,4 是 1 的孩子节点;3,5 是 2 的孩子节点;null,6 是 4 的孩子节点;null,7是 3 的孩子节点。
所以,为了达到这个效果,我们要借助队列。每次当根节点出队时让它的左右孩子节点入队,如此循环往复,直到队列再次为空。
3、代码实现
void BinaryTreeLevelOrder(BTNode* root)
{
Queue q;
QueueInit(&q);
QueuePush(&q, root);
while (!QueueEmpty(&q))
{
root = QueueFront(&q); /* 为了把 root 指针指向孩子节点 */
QueuePop(&q);
printf("%d ", root->_data);
if (root->_left != NULL)
QueuePush(&q, root->_left);
if (root->_right != NULL)
QueuePush(&q, root->_right);
}
QueueDestroy(&q);
}
4、变式:判断一棵二叉树是否为完全二叉树
(1)实现思路
众所周知,完全二叉树有个特点:最后一层的节点是连续的,一旦遇到第一个空节点,那么后面的节点都应该为空。因此,我们可以通过层序遍历最后一层,在遇到空节点之后如果还有不为空的节点,那么就不是完全二叉树。
但要注意:这里的层序遍历是就算遇到空节点也要让它进队列。
(2)代码实现
bool BinaryTreeComplete(BTNode* root)
{
Queue q;
QueueInit(&q);
QueuePush(&q, root);
while (!QueueEmpty(&q))
{
root = QueueFront(&q); /* 为了把 root 指针指向孩子节点 */
if (root == NULL)
{
break;
}
else
{
QueuePop(&q);
QueuePush(&q, root->_left);
QueuePush(&q, root->_right);
}
}
/* 遍历队列 */
while (q.front != NULL)
{
if (q.front->data != NULL)
{
QueueDestroy(&q);
return false;
}
q.front = q.front->next;
}
QueueDestroy(&q);
return true;
}
好啦,二叉树初阶环节到这里就结束了~~~