//二叉树的初始化操作。二叉树的初始化需要将指向二叉树的根结点指针置为空:
void InitBitTree(BiTree *T)//二叉树的初始化操作
{
*T=NULL;
}
//二叉树的销毁操作。如果二叉树存在,将二叉树存储空间释放:
void DestroyBitTree(BiTree *T)//销毁二叉树操作
{
if(*T)//如果是非空二叉树
{
if((*T)->lchild)
DestroyBitTree(&((*T)->lchild));
if((*T)->rchild)
DestroyBitTree(&((*T)->rchild));
free(*T);
*T=NULL;
}
}
//创建二叉树操作。根据二叉树的递归定义,先生成二叉树的根结点,将元素值赋给结点的数据域,然后递归创建
//左子树和右子树。其中‘#’表示空:
void CreatBitTree(BiTree *T)//递归创建二叉树
{
DataType ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BitNode));//生成根结点
if(!(*T))
exit(-1);
(*T)->data=ch;
CreatBitTree(&((*T)->lchild));
CreatBitTree(&((*T)->rchild));
}
}
//二叉树的左插入操作。指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的左子树
//,p指向结点的原来左子树成为c的右子树:
int InsertLeftChild(BiTree p,BiTree c)//二叉树的左插入操作
{
if(p)//如果指针p不空
{
c->rchild=p->lchild;//p的原来的左子树成为c的右子树
p->lchild=c;//子树c作为p的左子树
return 1;
}
return 0;
}
//二叉树的右插入操作。指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的右子树
//,p指向结点的原来右子树成为c的右子树:
int InsertRightChild(BiTree p,BiTree c)//二叉树的右插入操作
{
if(p)//如果指针p不空
{
c->rchild=p->rchild;//p的原来的右子树成为c的右子树
p->rchild=c;//子树c作为p的右子树
return 1;
}
return 0;
}
/*返回二叉树结点的指针操作。在二叉树中查找指向元素值为e的结点,如果找到该结点,则将该结点的指针
返回,否则,返回NULL。
具体实现:定义一个队列Q,用来存放二叉树中结点的指针,从根结点开始,判断结点的值是否等于e,如果
相等,则返回该结点的指针;否则,将该结点的左孩子结点的指针和右孩子结点的指针入队列。如果结点存在
左孩子结点,则将其左孩子的指针入队列;如果结点存在右孩子结点,则将其右孩子的指针入队列。然后将
队头的指针出队列,判断该指针指向的结点的元素值是否等于e,如果相等,则返回该结点的指针,否则,继续
将结点的左孩子结点的指针和右孩子结点的指针入队列。重复此操作,直到队列为空。*/
BiTree Point(BiTree T,DataType e)//查找元素值为e的结点的指针
{
BiTree 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;
}
//返回二叉树的结点的左孩子元素值操作。如果元素值为e的结点存在,并且该结点的左孩子结点存在,则将
//该结点的左孩子结点的元素值返回。
DataType LeftChild(BiTree T,DataType e)//返回二叉树的左孩子结点元素值操作
{
BiTree p;
if(T)//如果二叉树非空
{
p=Point(T,e);//p是元素值e的结点的指针
if(p&&p->lchild)//如果p不为空且p的左孩子结点存在
return p->lchild->data;
}
return;
}
//返回二叉树的结点的右孩子元素值操作。如果元素值为e的结点存在,并且该结点的右孩子结点存在,则将
//该结点的右孩子结点的元素值返回。
DataType RightChild(BiTree T,DataType e)//返回二叉树的右孩子结点元素值操作
{
BiTree p;
if(T)//如果二叉树非空
{
p=Point(T,e);//p是元素值e的结点的指针
if(p&&p->rchild)//如果p不为空且p的右孩子结点存在
return p->rchild->data;
}
return;
}
//二叉树的左删除操作。在二叉树中,指针p指向二叉树中的某个结点,将p所指向的结点的左子树删除。如果删除
//成功,返回1,否则返回0.
int DeleteLeftChild(BiTree p)//二叉树的左删除操作
{
if(p)//如果指针p不空
{
DestroyBitTree(&(p->lchild));//删除左子树
return 1;
}
return 0;
}
//二叉树的右删除操作。在二叉树中,指针p指向二叉树中的某个结点,将p所指向的结点的右子树删除。如果删除
//成功,返回1,否则返回0.
int DeleteRightChild(BiTree p)//二叉树的右删除操作
{
if(p)//如果指针p不空
{
DestroyBitTree(&(p->rchild));//删除右子树
return 1;
}
return 0;
}
二叉树的基本运算
最新推荐文章于 2022-05-11 19:21:14 发布