#include
#include
#define num 100
#define OK 1
typedef int Status;
typedef char DataType;
typedef struct node
{
DataType data;
struct node *lchild,*rchild;
}BinTNode,*BinTree;
int found;
BinTNode *p;
/*****************建立二叉樹*****************/
Status CreateBiTree(BinTree &bt) //1.按照先序遍歷次序遞建立二叉樹
{
char ch;
printf("ch=");
scanf("%c",&ch);
getchar();
if (ch==' ') bt=NULL; //程序中直接輸入空格停止
else
{ bt=(BinTNode *)malloc(sizeof(BinTNode));
bt->data=ch; //生成根結點
printf("請輸入左子樹:\n");
CreateBiTree(bt->lchild);
printf("請輸入右子樹:\n"); //構造左子樹
CreateBiTree(bt->rchild); //構造右子樹
} return OK;
}
/*****************中序遍歷二叉樹*****************/
Status Inorder(BinTree bt) //中序遍歷算法
{
BinTNode *stack[num]; //定義棧數組
int top=0; //初始化棧
stack[top]=bt;
do
{ while(NULL!=stack[top]) //掃描根結點及其所有的左結點並入棧
{ top=top+1;
stack[top]=stack[top-1]->lchild;
}
top=top-1; //退棧
if(top>=0) //判斷棧是否為空
{ printf("%c",stack[top]->data); //訪問結點
stack[top]=stack[top]->rchild; //掃描右子樹
}
}while(top>=0);
return OK;
}
/*Status Inorder(BinTree bt) //先序遍歷算法
{
BinTNode *stack[num]; //定義棧數組
int top=0; //初始化棧
stack[top]=bt;
do
{ while(NULL!=stack[top]) //掃描根結點及其所有的左結點並入棧
{ top=top+1;
printf("%c",stack[top]->data);
stack[top]=stack[top-1]->lchild;
}
top=top-1; //退棧
if(top>=0) //判斷棧是否為空
{ printf("%c",stack[top]->data); //訪問結點
stack[top]=stack[top]->rchild; //掃描右子樹
}
}while(top>=0);
return OK;
}
*/
/*****************求指定節點路徑*****************/
BinTree NodePath(BinTree bt, BinTNode *ch) //3.求二叉樹指定結點的路徑
{ typedef enum{FALSE,TRUE}boolean;
BinTNode *stack[num];//定義棧
int i,top,tag[num];
boolean find;//定義布爾類型變量
BinTNode *s;
find=FALSE;//初始化
top=0;
s=bt;
do
{while(s!=NULL)
{ top++;
stack[top]=s;
tag[top]=0;
s=s->lchild;
}
if(top>0)
{s=stack[top];
if(tag[top]==1)
{ if(s==ch)
{for(i=1;i<=top;i++)
printf("->%c",stack[i]->data);
find=TRUE;
}else top--;
s=stack[top];
}
if(top>0&&!find)
{ if(tag[top]!=1)
{ s=s->rchild;//掃描右子樹
tag[top]=1;
} else s=NULL;
}
}
}while(!find&&top!=0);
return s;
}
void FindBT(BinTree bt,DataType x)
{ if((bt!=NULL)&&!found)
{ if(bt->data==x)
{ p=bt;
found=1;
} else
{ FindBT(bt->lchild,x);
FindBT(bt->rchild,x);
}
}
}
BinTNode *Findx(BinTree bt,DataType x)
{ int found=0;
BinTree p=NULL;
FindBT(bt,x);
return(p);
}
/*****************求二叉樹的深度*****************/
int Depth(BinTree bt) //4.求二叉樹的深度
{ int h,lh,rh;
if (bt==NULL) h=0;
else
{ lh=Depth(bt->lchild);
rh=Depth(bt->rchild);
if (lh>=rh) h=lh+1;
else h=rh+1;
} return h;
}
/*****************求葉子節點的個數*****************/
int Leaf(BinTree bt) //5.求二叉樹的葉子結點個數
{ if (bt==NULL) return 0;
else if (bt->lchild==NULL&&bt->rchild==NULL)
return OK;
else return Leaf(bt->lchild)+Leaf(bt->rchild);
}
/*****************調換左右子樹*****************/
BinTNode *huhuan(BinTNode *p)//6.將p指針指向的二叉樹的左右子樹進行互換
{BinTNode *stack[num];//指針類型的堆棧
int k=0;
stack[k]=NULL;
if(p!=NULL)//交換p結點的左右孩子
{ k++;
stack[k]=p->lchild;
p->lchild=p->rchild;
p->rchild=stack[k];
p->lchild=huhuan(p->lchild);
p->rchild=huhuan(p->rchild);
} return (p);
}
/*****************主函數*****************/
void main()
{ BinTree bt;
char ch1;
int xz=1,sd=0,yz=0;
while(xz)
{ printf(" 建立二叉樹並求指定結點路徑 \n");
printf("============================\n");
printf(" 1.建立二叉樹的存儲結構 \n");
printf(" 2.求解二叉樹的中序遍歷 \n");
printf(" 3.求二叉樹指定結點的路徑 \n");
printf(" 4.求二叉樹的深度 \n");
printf(" 5.求二叉樹的葉子結點個數 \n");
printf(" 6.將二叉樹左右子樹交換 \n");
printf(" 0.退出系統 \n");
printf("============================\n");
printf(" 請選擇:(0-6) \n");
scanf("%d",&xz);
getchar();
switch(xz)
{
case 1: printf("請輸入根節點:\n");
CreateBiTree(bt);
printf( "二叉樹的鏈式存儲結構建立完成!\n");
break;
case 2:printf("該二叉樹的中序遍歷序列是:\n");
Inorder(bt);
printf( "\n");
break;
case 3:printf( "請輸入要求路徑的結點值:\n" );
ch1=getchar();
p=NULL;
found=0;
Findx(bt,ch1);
if(p!=NULL)
NodePath(bt,p);
else
printf( "沒有要求的節點! \n" );
printf( "\n" );
break;
case 4:sd=Depth(bt);
printf( "該二叉樹的深度為:%d \n ",sd );
printf("\n");
break;
case 5:yz=Leaf(bt);
printf( "該二叉樹的葉子節點數為:\n%d \n",yz );
printf( "\n" );
break;
case 6: bt=huhuan(bt);
printf( "該二叉樹的左右結點已交換成功,其中序遍歷序列是:\n" );
Inorder(bt);
printf( "\n" );
break;
}
}
}
上面說的有道理. 我建議你在Status CreateBiTree中返回創建好的二叉樹地址出來,讓main中bt來接收即可。這樣CreateBiTree就使無參的。
另外,main函數最好有返回值和輸入吧,便於控制。
最後,CreateBiTree中使用遞歸來創建二叉樹,這個你最好控制一下最大深度,否則棧會變得很可怕,也會越來越慢 (最好不要用這樣的方式來創建二叉樹)。另外,退出本級二叉樹最好別用空格了。