二叉樹基本演算法,遞迴非遞迴遍歷以及求高度、寬度等
二叉樹基本演算法,遍歷以及求高度、寬度等路徑
轉自Powered by: C++部落格 Copyright © 天一程
//二叉樹的相關演算法,《資料結構習題與解析》7.3
//演算法 49個,程式碼量1200+ ,時間9小時
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MaxSize 100
typedef char ElemType;
typedef char SBTree[20];
struct BTNode;
//所有的函式模組
void PreOrder(BTNode *b);
void PreOrder1(BTNode *b);
void InOrder(BTNode *b);
void InOrder1(BTNode *b);
void PostOrder(BTNode *b);
void PostOrder1(BTNode *b);
void TravLevel(BTNode *b);
void AllPath(BTNode *b);
void AllPath1(BTNode *b,ElemType path[],int pathlen);
void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen);
int AncestorPath(BTNode *b,BTNode *s);
void Print(BTNode *b,int w);
void LeafPath(BTNode *b);
void PreToPost(ElemType pre[],int l1,int h1,ElemType post[],int l2,int h2);
void CreateBTNode(BTNode *&b,char *str);
BTNode *CreateBT1(char *pre,char *in,int n);
BTNode *CreateBT2(char *post,char *in,int n,int m);
void DispBTNode(BTNode *b);
void DelTree(BTNode *b);
BTNode *Swap(BTNode *b);
void Swap1(BTNode *b,BTNode *&b1);
void Link(BTNode *b,BTNode *&head,BTNode *&tail);
void TriBTree(BTNode *b,BTNode *p);
BTNode* FindNode(BTNode *b,ElemType x);
BTNode *LchildNode(BTNode *p);
BTNode *RchildNode(BTNode *p);
ElemType PreNode(BTNode *b,int k,int& n);
ElemType PreNode1(BTNode *b,int k);
void InNode(BTNode *b,int k,int &n,ElemType &ch);
ElemType InNode1(BTNode *b,int k);
void PostNode(BTNode *b,int k,int& n,ElemType &ch);
ElemType PostNode1(BTNode *b,int k);
ElemType FirstNode(BTNode *b);
int ancestor(BTNode *b,BTNode *r,BTNode *s);
ElemType ancestor1(SBTree b,int i,int j);
void FindSon(BTNode *b,ElemType x);
int BTNodeDepth(BTNode *b);
int BTWidth(BTNode *b);
void NodeLevel(BTNode *b,ElemType x,int &h,int ih);
int LeafKLevel(BTNode *b,int k);
int Nodes(BTNode *b);
int LeafNodes(BTNode *b);
int DSonNodes(BTNode *b);
int CompBTNode(BTNode *b);
int CompBTNode1(SBTree b);
float ExpValue(BTNode *b);
int precede(char op1,char op2);
void PostExp(BTNode *b);
float CompValue();
//結點型別
typedef struct BTNode
{
ElemType data;
BTNode *lchild;
BTNode *rchild;
}BTNode;
/***********************函式模組實現部分************************/
//二叉樹的先序遍歷
//遞迴
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
printf("%c ",b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
//非遞迴
void PreOrder1(BTNode *b)
{
BTNode* St[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
top++;
St[top]=b;
while(top>-1)
{
p=St[top];
top--;
printf("%c ",p->data);
if(p->rchild!=NULL)
{
top++;
St[top]=p->rchild;
}
if(p->lchild!=NULL)
{
top++;
St[top]=p->lchild;
}
}
printf("\n");
}
}
//二叉樹的中序遍歷
//遞迴
void InOrder(BTNode *b)
{
if(b!=NULL)
{
InOrder(b->lchild);
printf("%c ",b->data);
InOrder(b->rchild);
}
}
//非遞迴
void InOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
p=b;
while(top>-1 || p!=NULL)
{
while(p!=NULL)
{
top++;
St[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=St[top];
top--;
printf("%c ",p->data);
p=p->rchild;
}
}
printf("\n");
}
}
//二叉樹的後序遍歷
//遞迴
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c ",b->data);
}
}
//非遞迴
void PostOrder1(BTNode *b)
{
BTNode *St[MaxSize];
BTNode *p;
int flag,top=-1;
if(b!=NULL)
{
do
{
while(b!=NULL)
{
top++;
St[top]=b;
b=b->lchild;
}
p=NULL;
flag=1;
while(top!=-1 && flag)
{
b=St[top];
if(b->rchild==p)
{
printf("%c ",b->data);
top--;
p=b;
}
else
{
b=b->rchild;
flag=0;
}
}
}while(top!=-1);
printf("\n");
}
}
//二叉樹的構造演算法
void CreateBTNode(BTNode *&b,char *str)
{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break;
case ')':top--;break;
case ',':k=2;break;
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
ch=str[++j];
}
}
//查詢結點(先序方法)
BTNode *FindNode(BTNode *b,ElemType x)
{
BTNode *p;
if(b==NULL)
return NULL;
else if(b->data==x)
return b;
else
{
p=FindNode(b->lchild,x);
if(p!=NULL)
return p;
else
return FindNode(b->rchild,x);
}
}
//查詢孩子結點
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
//求高度的演算法
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if(b==NULL)return 0;
else
{
lchilddep=BTNodeDepth(b->lchild);
rchilddep=BTNodeDepth(b->rchild);
}
return lchilddep > rchilddep ? (lchilddep+1) : (rchilddep+1);
}
//輸出二叉樹的演算法(遞迴形式)
void DispBTNode(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);
if(b->rchild!=NULL)
{
printf(",");
DispBTNode(b->rchild);
}
printf(")");
}
}
}
//構造二叉樹演算法(先序序列和中序序列)
BTNode *CreateBT1(char *pre,char *in,int n)
{
BTNode *s;
char *p;
int k;
if(n<=0)return NULL;
s=(BTNode *)malloc(sizeof(BTNode));
s->data=*pre;
for(p=in;p<in+n;p++)
if(*p==*pre)
break;
k=p-in;
s->lchild=CreateBT1(pre+1,in,k);
s->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
return s;
}
//(後序序列和中序序列)
BTNode *CreateBT2(char *post,char *in,int n,int m)
{
BTNode *s;
char *p,*q,*maxp;
int maxpost,maxin,k;
if(n<=0)return NULL;
maxpost=-1;
for(p=in;p<in+n;p++)
for(q=post;q<post+m;q++)
if(*p==*q)
{
k=q-post;
if(k>maxpost)
{
maxpost=k;
maxp=p;
maxin=p-in;
}
}
s=(BTNode *)malloc(sizeof(BTNode));
s->data=post[maxpost];
s->lchild=CreateBT2(post,in,maxin,m);
s->rchild=CreateBT2(post,maxp+1,n-maxin-1,m);
return s;
}
//依先序遍歷找第k個結點(遞迴形式)
ElemType PreNode(BTNode *b,int k,int& n)
{
ElemType ch;
if(b==NULL)return ' ';
if(n==k)
return b->data;
n++;
ch=PreNode(b->lchild,k,n);
if(ch!=' ')return ch;
ch=PreNode(b->rchild,k,n);
return ch;
}
//非遞迴形式
ElemType PreNode1(BTNode *b,int k)
{
BTNode *St[MaxSize],*p;
int top=-1,n=0;
if(b!=NULL)
{
top++;
St[top]=b;
while(top>-1)
{
p=St[top];
top--;
n++;
if(n==k)return p->data;
if(p->rchild!=NULL)
{
top++;
St[top]=p->rchild;
}
if(p->lchild!=NULL)
{
top++;
St[top]=p->lchild;
}
}
printf("\n");
}
return ' ';
}
//依中序遍歷找第k個結點(遞迴形式)
void InNode(BTNode *b,int k,int &n,ElemType &ch)
{
if(b!=NULL)
{
InNode(b->lchild,k,n,ch);
//printf("%c,n=%d \n",b->data,n);
if(n==k)ch=b->data;
n++;
InNode(b->rchild,k,n,ch);
}
}
//遞迴形式
ElemType InNode1(BTNode *b,int k)
{
BTNode *St[MaxSize],*p;
int top=-1,n=0;
if(b!=NULL)
{
p=b;
while(top>-1 || p!=NULL)
{
while(p!=NULL)
{
top++;
St[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=St[top];
top--;
n++;
if(n==k)return p->data;
p=p->rchild;
}
}
printf("\n");
}
return ' ';
}
//依後序遍歷找第k個結點(遞迴形式)
void PostNode(BTNode *b,int k,int &n,ElemType &ch)
{
if(b!=NULL)
{
PostNode(b->lchild,k,n,ch);
PostNode(b->rchild,k,n,ch);
//printf("%c,n=%d \n",b->data,n);
if(n==k)ch=b->data;
n++;
}
}
//非遞迴形式(後序存放在棧中的結點是當前結點的祖先)
ElemType PostNode1(BTNode *b,int k)
{
BTNode *St[MaxSize];
BTNode *p;
int flag,top=-1,n=0;
if(b!=NULL)
{
do
{
while(b!=NULL)
{
top++;
St[top]=b;
b=b->lchild;
}
p=NULL;
flag=1;
while(top!=-1 && flag)
{
b=St[top];
if(b->rchild==p)
{
n++;
if(n==k)return b->data;
top--;
p=b;
}
else
{
b=b->rchild;
flag=0;
}
}
}while(top!=-1);
printf("\n");
}
return ' ';
}
//依中序遍歷找第一個結點
ElemType FirstNode(BTNode *b)
{
if(b==NULL) return ' ';
while(b->lchild!=NULL)
b=b->lchild;
return b->data;
}
//層序遍歷
void TravLevel(BTNode *b)
{
BTNode *Qu[MaxSize];
int front,rear;
front=rear=0;
if(b!=NULL)
printf("%c ",b->data);
rear++;
Qu[rear]=b;
while(rear!=front)
{
front=(front+1)%MaxSize;
b=Qu[front];
if(b->lchild!=NULL)
{
printf("%c ",b->lchild->data);
rear=(rear+1)%MaxSize;
Qu[rear]=b->lchild;
}
if(b->rchild!=NULL)
{
printf("%c ",b->rchild->data);
rear=(rear+1)%MaxSize;
Qu[rear]=b->rchild;
}
}
printf("\n");
}
//求二叉樹的寬度
int BTWidth(BTNode *b)
{
struct
{
int lno;
BTNode *p;
}Qu[MaxSize];
int rear,front;
int lnum,max,i,n;
front=rear=0;
if(b!=NULL)
{
rear++;
Qu[rear].p=b;
Qu[rear].lno=1;
while(rear!=front)
{
front++;
b=Qu[front].p;
lnum=Qu[front].lno;
if(b->lchild!=NULL)
{
rear++;
Qu[rear].p=b->lchild;
Qu[rear].lno=lnum+1;
}
if(b->rchild!=NULL)
{
rear++;
Qu[rear].p=b->rchild;
Qu[rear].lno=lnum+1;
}
}
//printf("各結點編號:\n");
//for(i=1;i<=rear;i++)
// printf(" %c,%d\n",Qu[i].p->data,Qu[i].lno);
max=0;
lnum=1;
i=1;
while(i<=rear)
{
n=0;
while(i<=rear && Qu[i].lno==lnum)
{
n++;
i++;
}
lnum=Qu[i].lno;
if(n>max)max=n;
}
return max;
}
else
return 0;
}
//查詢結點的層號
//方法1:採用層序遍歷的思想(上個例子)
//方法2:遞迴形式
void NodeLevel(BTNode *b,ElemType x,int &h,int ih)
{
if(b==NULL) h=0;
else if(b->data==x)
h=ih;
else
{
NodeLevel(b->lchild,x,h,ih+1);
if(h==0)
NodeLevel(b->rchild,x,h,ih+1);
}
}
//求第k層的葉子結點數
int LeafKLevel(BTNode *b,int k)
{
BTNode *Qu[MaxSize];
int front,rear;
int leaf=0;
int last;
int level;
front=rear=0;
if(b==NULL || k<=1)
return 0;
rear++;
last=rear;
level=1;
Qu[rear]=b;
while(rear!=front)
{
front=(front+1)%MaxSize;
b=Qu[front];
if(level==k && b->lchild==NULL && b->rchild==NULL)
leaf++;
if(b->lchild!=NULL)
{
rear=(rear+1)%MaxSize;
Qu[rear]=b->lchild;
}
if(b->rchild!=NULL)
{
rear=(rear+1)%MaxSize;
Qu[rear]=b->rchild;
}
if(front==last)
{
level++;
last=rear;
}
if(level>k)
return leaf;
}
}
//(層序遍歷)鏈式結構,判斷二叉樹是否為完全二叉樹
//(1)某結點沒有左孩子,則一定無右孩子
//(2)若某結點缺左或右孩子,則其所有後繼一定無孩子
int CompBTNode(BTNode *b)
{
BTNode *Qu[MaxSize],*p;
int first=0,rear=0;
int cm=1;
int bj=1;
if(b!=NULL)
{
rear++;
Qu[rear]=b;
while(first!=rear)
{
first++;
p=Qu[first];
if(p->lchild==NULL)
{
bj=0;
if(p->rchild!=NULL)
cm=0; //可以直接break
}
else
{
if(bj==1)
{
rear++;
Qu[rear]=p->lchild;
if(p->rchild==NULL)
bj=0;
else
{
rear++;
Qu[rear]=p->rchild;
}
}
else
cm=0; //直接break
}
}
return cm;
}
return 1;
}
//順序結構,判斷二叉樹為完全二叉樹
int CompBTNode1(SBTree b,int nCount)
{
int i,j;
for(i=0;i<nCount;i++)
if(b[i]==' ')
{
j=i;
break;
}
for(j=i+1;j<nCount;j++)
if(b[j]!=' ')
return 0;
return 1;
}
//(層序遍歷)輸出二叉樹葉節點到根節點的路徑
//擴充套件結點資訊,儲存前趨結點位置
void AllPath(BTNode *b)
{
struct snode
{
BTNode *node;
int parent;
}q[MaxSize];
int front,rear,p;
front=rear=-1;
rear++;
q[rear].node=b;
q[rear].parent=-1;
while(front<rear)
{
front++;
b=q[front].node;
if(b->lchild==NULL && b->rchild==NULL)
{
printf("%c到根結點路徑:",b->data);
p=front;
while(q[p].parent!=-1)
{
printf("%c->",q[p].node->data);
p=q[p].parent;
}
printf("%c\n",q[p].node->data);
}
if(b->lchild!=NULL)
{
rear++;
q[rear].node=b->lchild;
q[rear].parent=front;
}
if(b->rchild!=NULL)
{
rear++;
q[rear].node=b->rchild;
q[rear].parent=front;
}
}
}
//另設一個數組儲存軌跡的資訊(先序遍歷)
void AllPath1(BTNode *b,ElemType path[],int pathlen)
{
int i;
if(b!=NULL)
{
if(b->lchild==NULL && b->rchild==NULL)
{
printf(" %c到根結點路徑: %c ",b->data,b->data);
for(i=pathlen-1;i>=0;i--)
printf("%c ",path[i]);
printf("\n");
}
else
{
path[pathlen]=b->data;
pathlen++;
AllPath1(b->lchild,path,pathlen);
AllPath1(b->rchild,path,pathlen);
pathlen--;
}
}
}
//(先序遍歷,遞迴形式)求最長的路徑
void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen)
{
int i;
if(b==NULL)
{
if(pathlen>longpathlen)
{
for(i=pathlen-1;i>=0;i--)
longpath[i]=path[i];
longpathlen=pathlen;
}
}
else
{
path[pathlen]=b->data;
pathlen++;
LongPath(b->lchild,path,pathlen,longpath,longpathlen);
LongPath(b->rchild,path,pathlen,longpath,longpathlen);
pathlen--;
}
}
//(遞迴)統計結點個數
int Nodes(BTNode *b)
{
int num1,num2;
if(b==NULL)
return 0;
else if(b->lchild==NULL && b->rchild==NULL)
return 1;
else
{
num1=Nodes(b->lchild);
num2=Nodes(b->rchild);
return (num1+num2+1);
}
}
//(遞迴)統計所有葉子結點個數
int LeafNodes(BTNode *b)
{
int num1,num2;
if(b==NULL)
return 0;
else if(b->lchild==NULL && b->rchild==NULL)
return 1;
else
{
num1=LeafNodes(b->lchild);
num2=LeafNodes(b->rchild);
return (num1+num2);
}
}
//(遞迴)統計所有雙分支結點個數
int DSonNodes(BTNode *b)
{
int num1,num2,n;
if(b==NULL)
return 0;
else if(b->lchild==NULL || b->rchild==NULL)
n=0;
else
n=1;
num1=DSonNodes(b->lchild);
num2=DSonNodes(b->rchild);
return (num1+num2+n);
}
//(遞迴)刪除二叉樹
void DelTree(BTNode *b)
{
if(b!=NULL)
{
DelTree(b->lchild);
DelTree(b->rchild);
free(b);
}
}
//(遞迴)交換左右子樹
BTNode *Swap(BTNode *b)
{
BTNode *t,*t1,*t2;
if(b==NULL)
t=NULL;
else
{
t=(BTNode *)malloc(sizeof(BTNode));
t->data=b->data;
t1=Swap(b->lchild);
t2=Swap(b->rchild);
t->lchild=t2;
t->rchild=t1;
}
return t;
}
//(遞迴)交換左右子樹
void Swap1(BTNode *b,BTNode *&b1)
{
if(b==NULL)
b1=NULL;
else
{
b1=(BTNode *)malloc(sizeof(BTNode));
b1->data=b->data;
Swap1(b->lchild,b1->rchild);
Swap1(b->rchild,b1->lchild);
}
}
//(非遞迴,後序遍歷,存放祖先資訊)求包含r,s兩個結點的最小子樹
//r,s不互為祖先,假設r在s的左邊
int ancestor(BTNode *b,BTNode *r,BTNode *s)
{
BTNode *St[MaxSize];
BTNode *p;
ElemType anor[MaxSize];
int i,flag,top=-1;
do
{
while(b!=NULL)
{
top++;
St[top]=b;
b=b->lchild;
}
p=NULL;
flag=1;
while(top!=-1 && flag)
{
b=St[top];
if(b->rchild==p)
{
if(b==r)
{
for(i=0;i<=top;i++)
anor[i]=St[i]->data;
top--;
p=b;
}
else if(b==s)
{
i=0;
while(anor[i]==St[i]->data)
i++;
printf("最近公共祖先:%c\n",anor[i-1]);
return 1;
}
else
{
top--;
p=b;
}
}
else
{
b=b->rchild;
flag=0;
}
}
}while(top!=-1);
return 0;
}
//(非遞迴,後序遍歷,存放結點資訊)輸出根結點到s結點的路徑
int AncestorPath(BTNode *b,BTNode *s)
{
BTNode *St[MaxSize];
BTNode *p;
int i,flag,top=-1;
do
{
while(b!=NULL)
{
top++;
St[top]=b;
b=b->lchild;
}
p=NULL;
flag=1;
while(top!=-1 && flag)
{
b=St[top];
if(b->rchild==p)
{
if(b==s)
{
for(i=0;i<=top;i++)
printf("%c ",St[i]->data);
return 1;
}
else
{
top--;
p=b;
}
}
else
{
b=b->rchild;
flag=0;
}
}
}while(top!=-1);
return 0;
}
//順序儲存,求下標i,j最近公共祖先結點的值
ElemType ancestor1(SBTree b,int i,int j)
{
int p=i,q=j;
while(p!=q)
if(p>q)
p=p/2;
else
q=q/2;
return b[p];
}
//(鏈式儲存,先序遍歷,遞迴)利用rchild將二叉樹葉節點按從左到右
//的順序串成一個單鏈表
void Link(BTNode *b,BTNode *&head,BTNode *&tail)
{
if(b!=NULL)
{
if(b->lchild==NULL && b->rchild==NULL)
if(head==NULL)
{
head=b;
tail=b;
}
else
{
tail->rchild=b;
tail=b;
}
if(b->lchild!=NULL)
Link(b->lchild,head,tail);
if(b->rchild!=NULL)
Link(b->rchild,head,tail);
}
}
//(鏈式儲存,遞迴)將二叉樹逆時針旋轉90度
//列印輸出
void Print(BTNode *b,int w)
{
int i;
if(b!=NULL)
{
Print(b->rchild,w+5);
for(i=1;i<w;i++)
printf(" ");
printf("%c\n",b->data);
Print(b->lchild,w+5);
}
}
//(鏈式儲存,遞迴)設計二叉樹,表示父子、夫妻和兄弟3種關係
//並能查詢任意父親結點的所有兒子演算法
void FindSon(BTNode *b,ElemType x)
{
BTNode *p;
if(b!=NULL)
{
if(b->data==x)
{
p=b->lchild;
p=p->rchild;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->rchild;
}
}
else
{
FindSon(b->lchild,x);
FindSon(b->rchild,x);
}
}
}
//採用括號表示法表示算術表示式
//計算表示式的值
float ExpValue(BTNode *b)
{
float lv,rv,value=0;
if(b!=NULL)
{
if(b->data!='+' && b->data!='-' && b->data!='*' && b->data!='/')
return b->data-'0';
lv=ExpValue(b->lchild);
rv=ExpValue(b->rchild);
switch(b->data)
{
case '+':value=lv+rv;break;
case '-':value=lv-rv;break;
case '*':value=lv*rv;break;
case '/':if(rv!=0)value=lv/rv;
else exit(0);
break;
}
}
return value;
}
//將上例中的二叉樹中序輸出
int precede(char op1,char op2)
{
if(op1!='+' && op1!='-' && op1!='*' && op1!='/')return -1;
if(op2!='+' && op2!='-' && op2!='*' && op2!='/')return -1;
switch(op1)
{
case '+':
case '-':if(op2=='+' || op2=='-')
return 0;
else
return -1;
case '*':
case '/':if(op2=='*' || op2=='/')
return 0;
else
return 1;
}
}
void InorderExp(BTNode *b)
{
int bracket;
if(b!=NULL)
{
if(b->lchild!=NULL)
{
bracket=precede(b->data,b->lchild->data);
if(bracket==1) printf("(");
InorderExp(b->lchild);
if(bracket==1) printf(")");
}
printf("%c",b->data);
if(b->rchild!=NULL)
{
bracket=precede(b->data,b->rchild->data);
if(bracket==1) printf("(");
InorderExp(b->rchild);
if(bracket==1) printf(")");
}
}
}
//將上例的二叉樹按後序遍歷得到字尾表示式
//再對字尾表示式求值
char postexp[MaxSize];
int n=0;
void PostExp(BTNode *b)
{
if(b!=NULL)
{
PostExp(b->lchild);
PostExp(b->rchild);
postexp[n++]=b->data;
}
}
float CompValue()
{
float St[MaxSize],opnd,opnd1,opnd2;
char ch;
int top=-1,i=0;
while(i<n)
{
ch=postexp[i++];
switch(ch)
{
case '+':opnd1=St[top];top--;
opnd2=St[top];top--;
opnd=opnd2+opnd1;
top++;St[top]=opnd;
break;
case '-':opnd1=St[top];top--;
opnd2=St[top];top--;
opnd=opnd2-opnd1;
top++;St[top]=opnd;
break;
case '*':opnd1=St[top];top--;
opnd2=St[top];top--;
opnd=opnd2*opnd1;
top++;St[top]=opnd;
break;
case '/':opnd1=St[top];top--;
opnd2=St[top];top--;
if(opnd1==0)exit(0);
opnd=opnd2/opnd1;
top++;St[top]=opnd;
break;
default: top++;St[top]=ch-'0';
break;
}
}
return St[0];
}
float ExpValue1(BTNode *b)
{
PostExp(b);
return CompValue();
}
//在二叉樹中增加一個指向雙親結點的parent指標
//並輸出所有結點到根結點的路徑
/*
void TriBTree(BTNode *&b,BTNode *p)
{
if(b!=NULL)
{
b->parent=p;
TriBTree(b->lchild,b);
TriBTree(b->rchild,b);
}
}
void LeafPath(BTNode *b)
{
BTNode *p;
if(b!=NULL)
{
p=b;
printf("從%c到根結點路徑:",p->data);
while(p!=NULL)
{
printf("%c ",p->data);
p=p->parent;
}
printf("\n");
LeafPath(b->lchild);
LeadPath(b->rchild);
}
}*/
//若b為一棵滿二叉樹,將先序遍歷序列
//轉化為後序遍歷序列
void PreToPost(ElemType pre[],int l1,int h1,ElemType post[],int l2,int h2)
{
int half;
if(h1>=l1)
{
post[h2]=pre[l1];
half=(h1-l1)/2;