二叉树
树是n个节点的有限集
每个节点事多有两颗子树的树称为 二叉树
二叉树的层次遍历
使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果。
以下面数结构为例:
0入队 -- 0出队 1,2入队
1出队 3,4入队
2出队 5入队,只有一个右孩子,右孩子入队
3出队 没有孩子,没有入队
4出队 没有孩子,没有入队
5出队 6入队,只有一个左孩子,左孩子入队
6出队 没有孩子,没有入队
队列中没有数据结束(队头和队尾重合)
因此最后的输出顺序为:0 1 2 3 4 5 6
构造二叉树的节点
一个成员用来保存左侧子节点的地址
一个成员用来保存右侧子节点的地址
一个成员用来保存数据值。
如果没有左节点或者右节点赋值为NULL
typedef struct node
{
struct node *lchild;
int data;
struct node *rchild;
}NODE;
二叉树的构造
// 根节点
NODE root;
// 定义6个节点
NODE n1;
NODE n2;
NODE n3;
NODE n4;
NODE n5;
NODE n6;
// 构造二叉树
root.lchild = &n1;
root.data = 0;
root.rchild = &n2;
n1.lchild = &n3;
n1.data = 1;
n1.rchild = &n4;
n2.lchild = NULL;
n2.data = 2;
n2.rchild = &n5;
n3.lchild = NULL;
n3.data = 3;
n3.rchild = NULL;
n4.lchild = NULL;
n4.data = 4;
n4.rchild = NULL;
n5.lchild = &n6;
n5.data = 5;
n5.rchild = NULL;
n6.lchild = NULL;
n6.data = 6;
n6.rchild = NULL;
二叉树层次遍历的C语言实现
#include<stdio.h>
typedef struct node
{
struct node *lchild;
int data;
struct node *rchild;
}NODE;
int main()
{
// 根节点
NODE root;
// 定义6个节点
NODE n1;
NODE n2;
NODE n3;
NODE n4;
NODE n5;
NODE n6;
// 定义队列
NODE *queue[20];
// 队头和队尾标记
int front = 0;
int rear = 0;
// 每一次出队的成员
NODE *p;
// 构造二叉树
root.lchild = &n1;
root.data = 0;
root.rchild = &n2;
n1.lchild = &n3;
n1.data = 1;
n1.rchild = &n4;
n2.lchild = NULL;
n2.data = 2;
n2.rchild = &n5;
n3.lchild = NULL;
n3.data = 3;
n3.rchild = NULL;
n4.lchild = NULL;
n4.data = 4;
n4.rchild = NULL;
n5.lchild = &n6;
n5.data = 5;
n5.rchild = NULL;
n6.lchild = NULL;
n6.data = 6;
n6.rchild = NULL;
// 头结点入队
queue[rear++] = &root;
while(front < rear)
{
// 出队
p = queue[front++];
printf("%d ",p->data);
// 左右孩子入队
if(p->lchild != NULL)
{
queue[rear++] = p->lchild;
}
if(p->rchild != NULL)
{
queue[rear++] = p->rchild;
}
}
return 0;
}
运行结果:0 1 2 3 4 5 6