二叉樹的基本運算
//二叉樹的初始化操作。二叉樹的初始化須要將指向二叉樹的根結點指針置為空: 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; }
二叉樹的基本運算