二叉树的层次遍历与案例分析
本文是上一篇文章的后续,详情点击该链接~
层次遍历
层次遍历就像图中一样,从上到下,从左到右的顺序遍历。而要实现这个遍历的话,我们可以建立一个循环队列。先将二叉树的头结点入队列。然后出队列访问这个结点,如果它有左子树,就把左子树的根节点入队。如果它有右子树,就把右子树的根节点入队。然后出队,访问。一直往复至空为止。
代码实现
void levelOrder(Tree *tree) {
int front, rear;
//定义一个循环队列,用来记录将要访问的层次上的结点
Tree* queue[MAXSIZE];
front = rear = 0;
Tree* p;
if (tree != NULL) {
rear = (rear + 1) % MAXSIZE;
//根结点入队
queue[rear] = tree;
while (front != rear) {
front = (front + 1) % MAXSIZE;
//队头结点出队
p = queue[front];
printf("%c ",p->data);
//如果左子树不空,左子树根节点入队
if (p->left != NULL) {
rear = (rear + 1) % MAXSIZE;
queue[rear] = p->left;
}
//如果右子树不空,则右子树的根节点入队
if (p->right != NULL) {
rear = (rear + 1) % MAXSIZE;
queue[rear] = p->right;
}
}
}
printf("\n");
}
构建图中的二叉树
Tree* tree = (Tree*)malloc(sizeof(Tree));
tree = getTree('A');
tree->left = getTree('B');
tree->right = getTree('C');
tree->left->left = getTree('D');
tree->left->right = getTree('E');
tree->left->left->left = getTree('H');
tree->left->left->right = getTree('I');
tree->left->right->left = getTree