//二叉樹的初始化操作。二叉樹的初始化需要將指向二叉樹的根結點指針置爲空:
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;
}
二叉樹的基本運算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.