二叉樹基本操作
1.初始化
2.建樹
3.銷毀樹
4.插入操作
5.查找元素值為e的節點的指針
6.查找元素值為e的節點左節點的值
7.查找元素值為e的節點右節點的值
8.刪除左子樹
9.刪除右子樹
10.先序遍歷
11.中序遍歷
12.后序遍歷
13. 計算葉子節點數
14.計算非葉子節點數
15.計算樹的深度
我輸入的樹按先序輸入
ABC##D##EF#G##HI###
代碼
#include<bits/stdc++.h>
using namespace std;
const int maxsize=1000;
typedef struct Node{
char date;
struct Node *lchild;
struct Node *rchild;
}*BiTree,BitNode;
void InitBitree(BiTree *T){
*T=NULL;
}
void DestroyBitree(BiTree *T){
if(*T){
if((*T)->lchild)
DestroyBitree(&((*T)->lchild));
if((*T)->rchild)
DestroyBitree(&((*T)->rchild));
free(*T);
*T=NULL;
}
}
void CreateBitree(BiTree *T){
char ch;
cin>>ch;
if(ch=='#') *T=NULL;
else{
*T=(BiTree)malloc(sizeof(BitNode));//生成根節點
if(!(*T))
exit(-1);
(*T)->date=ch;
CreateBitree(&((*T)->lchild));//遞歸創建左右子樹
CreateBitree(&((*T)->rchild));
}
}
bool InsertLeftchild(BiTree p,BiTree c)//將c插入T,c作為p的左子樹
{
if(p){
c->lchild=p->lchild;
p->lchild==c;
return 1;
}
return 0;
}
bool InsertRightchild(BiTree p,BiTree c){//將c插入T,c作為p的右子樹
if(p){
c->rchild=p->rchild;
p->rchild=c;
return 1;
}
return 0;
}
BitNode *Point(BiTree T,char 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->date==e) return p;
if(p->lchild){
q[rear]=p->lchild;
rear++;
}
if(p->rchild){
q[rear]=p->rchild;
rear++;
}
}
}
return NULL;
}
char LeftChild(BiTree T,char e){//查找元素值為e的節點左節點的值
BiTree p;
if(T){
p=Point(T,e);
if(p&&p->lchild) return p->lchild->date;
}
//return;
}
char RightChild(BiTree T,char e){//查找元素值為e的節點右節點的值
BiTree p;
if(T){
p=Point(T,e);
if(p&&p->rchild) return p->rchild->date;
}
//return ;
}
bool DelectLeftChild(BiTree p){//刪除左子樹
if(p){
DestroyBitree(&(p->lchild));
return 1;
}
return 0;
}
bool DelectRightChild(BiTree p){//刪除右子樹
if(p){
DestroyBitree(&(p->rchild));
return 1;
}
return 0;
}
//二叉樹的遍歷(遞歸地遍歷),先序(根左右),中序(左根右),后序(左右根)
void PreOrderTraverse(BiTree T){
if(T){
printf("%2c",T->date);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
printf("%2c",T->date);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%2c",T->date);
}
}
int leafnum(BiTree T){//葉子節點數
if(!T) return 0;
else if((!T->lchild)&&(!T->rchild)) return 1;
else return leafnum(T->lchild)+leafnum(T->rchild);
}
int Notleafnum(BiTree T){//非葉子節點數
if(!T) return 0;
else if(!T->lchild&&!T->rchild) return 0;
else return Notleafnum(T->lchild)+Notleafnum(T->rchild)+1;
}
int deapth(BiTree T){
if(!T) return 0;
else return deapth(T->lchild)>deapth(T->rchild)? deapth(T->lchild)+1:deapth(T->rchild)+1;
}
int main(){
BiTree T,root;
//freopen("in.txt","r",stdin);
InitBitree(&T);
cout<<"According to the first order to create a binary tree\n";//按先序建樹
CreateBitree(&T);
cout<<"First sequence traversal of binary tree is\n";//先序遍歷
PreOrderTraverse(T);
cout<<endl;
cout<<"In the binary tree traversal is\n";//中序遍歷
InOrderTraverse(T);
cout<<endl;
cout<<"After the binary tree traversal is\n";//后序遍歷
PostOrderTraverse(T);
cout<<endl;
cout<<"E's leftChild is"<<' '<<LeftChild(T,'E')<<endl;//E的左兒子
cout<<"E's RightChild is"<<' '<<RightChild(T,'E')<<endl;//E的右兒子
cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//葉子節點數
cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非葉子節點數
cout<<"The tree's deapth is "<<deapth(T)<<endl;//樹的深度
DelectLeftChild(T)?cout<<"Delection is success\n":"Delection is fail\n";//刪除樹的左子樹
//刪除后看一下里面的什么情況
cout<<"First sequence traversal of binary tree is\n";//先序遍歷
PreOrderTraverse(T);
cout<<endl;
cout<<"In the binary tree traversal is\n";//中序遍歷
InOrderTraverse(T);
cout<<endl;
cout<<"After the binary tree traversal is\n";//后序遍歷
PostOrderTraverse(T);
cout<<endl;
cout<<"The tree's leafnumber is "<<leafnum(T)<<endl;//葉子節點數
cout<<"The tree's notleafnumber is "<<Notleafnum(T)<<endl;//非葉子節點數
cout<<"The tree's deapth is "<<deapth(T)<<endl;//樹的深度
return 0;
}