//层次遍历二叉树
#include <malloc.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
//二叉树节点 链式
typedef struct BiTNode
{
int data; //数据域
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
//链队节点
typedef struct LinkNode
{
BiTNode *data;
struct LinkNode *next;
} LinkNode;
//链队
typedef struct LinkQueue
{
LinkNode *front, *rear;
} LinkQueue;
//链队初始化
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
//判队空
bool IsEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
//链队入队
void EnQueue(LinkQueue &Q, BiTree x)//BiTree x 等价于 BiTNode *x
{
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s;
Q.rear = s;
}
//链队出队
bool DeQueue(LinkQueue &Q, BiTree &x)
{
if (Q.front == Q.rear)
return false;
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front;
free(p);
return true;
}
//层序遍历
void LevelOrder(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q))
{
DeQueue(Q, p);
printf(" %d", p->data);
if (p->lchild != NULL)
EnQueue(Q, p->lchild);
if (p->rchild != NULL)
EnQueue(Q, p->rchild);
}
}
BiTree CreateBiTree(BiTree &T)
{ //利用先序遍历创建二叉树
int x;
printf("请输入下一个数字\n");
scanf("%d", &x);
if (x != 0)
{ //等于0时跳过,所以该节点还为空
T = (BiTree)malloc(sizeof(BiTNode));
T->data = x;
T->lchild = NULL;
T->rchild = NULL;
T->lchild = CreateBiTree(T->lchild);
T->rchild = CreateBiTree(T->rchild);
}
return T;
}
int main()
{
//定义一颗空树
BiTree Q = NULL;
CreateBiTree(Q);
LevelOrder(Q);
system("pause");
}
中序线索二叉树的构造
//二叉树节点 链式
typedef struct ThreadNode
{
int data; //数据域
struct ThreadNode *lchild, *rchild; //左右孩子指针
int ltag, rtag; //左右线索标志
} ThreadNode, *ThreadTree;
ThreadNode *pre = NULL;
//构造函数
void visit(ThreadNode *q)
{
if (q->lchild == NULL)
{
q->lchild = pre;
q->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
//中序线索二叉树的构造
void InThread(ThreadTree T)
{
if (T != NULL)
{
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
先序线索二叉树的构造
//二叉树节点 链式
typedef struct ThreadNode
{
int data; //数据域
struct ThreadNode *lchild, *rchild; //左右孩子指针
int ltag, rtag; //左右线索标志
} ThreadNode, *ThreadTree;
ThreadNode *pre = NULL;
//构造函数
void visit(ThreadNode *q)
{
if (q->lchild == NULL)
{
q->lchild = pre;
q->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
//先序线索二叉树的构造
void preThread(ThreadTree T)
{
if (T != NULL)
{
visit(T);
if (T->ltag == 0) //防止转圈
preThread(T->lchild);
preThread(T->rchild);
}
}