二叉链表存储结构的类型定义如下:
typedef struct Node
{
DataType data;
struct Node *lchild;
struct Node *rchild;
}*BiTree,BitNode;
二叉树的基本运算:
(1)二叉树的初始化操作。
二叉树的初始化需要将指向二叉树的根结点指针置为空。
void InitBitTree(BiTree *T)
{
*T=NULL;
}
(2)二叉树的销毁操作。
void DestroyBitTree(BiTree *T)
{
if (*T)
{
if ((*T)->lchild)
{
DestroyBitTree(&((*T)->lchild));
}
if ((*T)->rchild)
{
DestroyBitTree(&((*T)->rchild));
}
free(*T);
*T=NULL;
}
}
(3)创建二叉树操作。
根据二叉树的递归定义,先生成二叉树的根结点,将元素值赋值给结点的数据域,然后递归创建左子树和右子树。
void CreateBitTree(BiTree *T)
{
DataType ch;
scanf("%c",&ch);
if (ch=='#')
{
*T=NULL;
}
else
{
*T=(BiTree)malloc(sizeof(BitNode)); //生成根结点
if (!(*T))
{
exit(-1);
}
(*T)->data=ch;
CreateBitTree(&((*T)->lchild)); //构造左子树
CreateBitTree(&((*T)->rchild)); //构造右子树
}
}
(4)二叉树的左插入操作。
指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的左子树,p指向结点的原来左子树成为右子树。
int InsertLeftChild(BiTree p,BiTree c)
{
if (p)
{
c->rchild=p->lchild;
p->lchild=c;
return 1;
}
return 0;
}
(5)二叉树的右插入操作。
指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的右子树,p指向结点的原来右子树成为右子树。
int InsertRightChild(BiTree p,BiTree c)
{
if (p)
{
c->rchild=p->rchild;
p->rchild=c;
return 1;
}
return 0;
}
(6)返回二叉树结点的指针操作。
在二叉树中查找指向元素值为e的结点,如果找到该结点,则返回该结点的指针,否则,返回NULL。
BiTree Point(BiTree T,DataType e)
{
BiTree Q[MaxSize]; //定义一个队列,用于存放二叉树中结点的指针
int front=0,rear=0; //初始化队列
BitNode *p;
if (T)
{
Q[rear]=T;
rear++;
while(front==rear) //如果队列非空
{
p=Q[front++]; //取出队头指针,并出队
if (p->data==e)
{
return p;
}
if (p->lchild) //如果左孩子结点存在,将左孩子结点入队
{
Q[rear++]=p->lchild;
}
if (p->rchild) //如果右孩子结点存在,将右孩子结点入队
{
Q[rear++]=p->rchild;
}
}
}
return NULL;
}
(7)返回二叉树结点的左孩子元素值操作。
如果元素值为e的结点存在,并且该结点的左孩子结点存在,则将该结点的左孩子结点的元素值返回。
DataType LeftChild(BiTree T,DataType e)
{
BiTree p;
if (T)
{
p=Point(T,e);
if (p&&p->lchild)
{
return p->lchild->data;
}
}
return;
}
(8)返回二叉树结点的右孩子元素值操作。
如果元素值为e的结点存在,并且该结点的右孩子结点存在,则将该结点的右孩子结点的元素值返回。
DataType RightChild(BiTree T,DataType e)
{
BiTree p;
if (T)
{
p=Point(T,e);
if (p&&p->rchild)
{
return p->rchild->data;
}
}
return;
}
(9)二叉树的左删除操作。
在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的左子树删除。
int DeleteLeftChild(BiTree p)
{
if (p)
{
DestroyBitTree(&(p->lchild));
return 1;
}
return 0;
}
(10)二叉树的右删除操作。
在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的右子树删除。
int DeleteRightChild(BiTree p)
{
if (p)
{
DestroyBitTree(&(p->rchild));
return 1;
}
return 0;
}