二叉树的链式存储
LinkBitTree.h
//数据类型
typedef int DataType;
//二叉树结点类型
typedef struct Node
{
DataType data;
struct Node *lchild;
struct Node *rchild;
}*BitTree,BitNode;
//二叉树初始化
//根结点指针置空
//*BitTree是Node类型的指针,BitTree是指针变量,是变量
//BitTree *T 是指向 (指针变量BitTree)的指针
//BitTree存储的是二叉树结点的内存地址,变量T存储的是BitTree的内存地址
//总之BitTree是内存地址,传递参数是要注意
void InitBitTree(BitTree *T){
*T=NULL;
}
//递归销毁二叉树
void DestroyBitTree(BitTree *T){
if(*T){
if((*T)->lchild)
DestroyBitTree(&((*T)->lchild));
if((*T)->rchild)
DestroyBitTree(&((*T)->rchild));
}
free(*T);
*T=NULL;
}
//递归创建二叉树,#代表空
void CreatBitTree(BitTree *T)
{
DataType ch;
scanf("%c",&ch);
/* %是格式化输出符号,后面接输出格式;d 表示十进制;o 表示八进制;ox 表示十六进制;
c 表示输出字符 */
if(ch=='#')
*T=NULL;
else
{
*T = (BitTree)malloc(sizeof(BitNode));
if(!(*T))
exit(-1);
(*T)->data=ch;
CreateBitTree(&((*T)->lchild));
CreateBitTree(&((*T)->rchild));
}
}
//二叉树左插入操作。指针p指向二叉树T某个结点,将子树c插入到T中,使c成为p指向结点的左子树,p指向结点的原来的左子树成为c的右子树
int InsertLeftChild(BitTree p,BitTree c)
{
if(p)
{
c->rchild = p->lchild;
p->lchild = c;
return 1;
}
return 0;
}
//二叉树右插入操作。指针p指向二叉树T某个结点,将子树c插入到T中,使c成为p指向结点的右子树,p指向结点的原来的左子树成为c的右子树
int InsertRightChild(BitTree p,BitTree c)
{
if(p)
{
c->rchild = p->rchild;
p->rchild = c;
return 1;
}
return 0;
}
//返回二叉树结点值为e的指针操作
BitTree Point(BitTree T,DataType e)
{
BitTree Q[MaxSIZE];
int front = 0 , rear = 0;
BitNode *p;
if(T)
{
Q[rear] = T;
rear++;
while(front!=rear)
{
p=Q[front];
front++;
if(p->data==e) return p;
if(p->lchild)
{
Q[rear]=p->lchild;
rear++;
}
if(p->rchild)
{
Q[rear]=p->rchild;
rear++;
}
}
}
return NULL;
}