用二叉樹求解代數表示式

2021-07-07 07:55:53 字數 2277 閱讀 4759

問題描述:  用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數(為簡化,只支援二目運算的+、-、*、/,不加括號,

運算數也只是一位的數字字元。本專案只考慮輸入合乎以上規則的情況)。請設計演算法,

(1)根據形如「1+2?3?4/5」的字串代表的表示式,構造出對應的二叉樹(如圖),

用後序遍歷的思路計算表示式的值時,能體現出先乘除後加減的規則;

(2)對構造出的二叉樹,計算出表示式的值。

輸入描述: 若干測試資料。

程式輸出: 代數表示式,對應二叉樹,表示式的值。

#include #include #include#include #define maxsize 100

typedef char elemtype;

typedef struct node

btnode;

void createbtnode(btnode *&b,char *str); //由str串建立二叉鏈

btnode *findnode(btnode *b,elemtype x); //返回data域為x的節點指標

btnode *lchildnode(btnode *p); //返回*p節點的左孩子節點指標

btnode *rchildnode(btnode *p); //返回*p節點的右孩子節點指標

int btnodedepth(btnode *b); //求二叉樹b的深度

void dispbtnode(btnode *b); //以括號表示法輸出二叉樹

void destroybtnode(btnode *&b); //銷毀二叉樹

void createbtnode(btnode *&b,char *str) //由str串建立二叉鏈}}

j++;

ch=str[j];

}}btnode *findnode(btnode *b,elemtype x) //返回data域為x的節點指標

}btnode *lchildnode(btnode *p) //返回*p節點的左孩子節點指標

btnode *rchildnode(btnode *p) //返回*p節點的右孩子節點指標

int btnodedepth(btnode *b) //求二叉樹b的深度

}void dispbtnode(btnode *b) //以括號表示法輸出二叉樹

}}void destroybtnode(btnode *&b) //銷毀二叉樹

}//用s[i]到s[j]之間的字串,構造二叉樹的表示形式

btnode *crtree(char s,int i,int j)

//以下為i!=j的情況

for (k=i; k<=j; k++)

if (s[k]=='+' || s[k]=='-')

if (plus==0) //沒有+或-的情況(因為若有+、-,前面必會執行plus++)

for (k=i; k<=j; k++)

if (s[k]=='*' || s[k]=='/')

//以上的處理考慮了優先將+、-放到二叉樹較高的層次上

//由於將來計算時,運用的是後序遍歷的思路

//處於較低層的乘除會優先運算

//從而體現了「先乘除後加減」的運算法則

//建立乙個分支節點,用檢測到的運算子作為節點值

if (plus!=0)

else //若沒有任何運算子,返回null

return null;

}double comp(btnode *b)

}int main()

{ btnode *b;

char s[maxsize]="1+2*3-4/5";

printf("代數表示式%s\n",s);

b=crtree(s,0,strlen(s)-1);

printf("對應二叉樹:");

dispbtnode(b);

printf("\n表示式的值:%g\n",comp(b));

destroybtnode(b);

return 0;

執行結果:

第十一周專案5用二叉樹求解代數表示式

1 2 3 4 5 問題及描述 btree.h ifndef btree h included define btree h included define maxsize 100 typedef char elemtype typedef struct node btnode void creat...

第十一周 專案2 用二叉樹求解代數表示式

檔名稱 main.cpp,btree.h,btree.cpp 完成日期 2015年11月5日 版本號 code block 12.11 問題描述 用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數 為簡化,只支援二目運算的 不加括號,運算數也只是一位的數字字元。...

第十一周專案2 用二叉樹求解代數表示式

all right reserved.檔名稱 test.cpp 完成日期 2015年11月13日 版本號 v1.0 問題描述 用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數 為簡化,只支援二目運算的 不加括號,運算數也只是一位的數字字元。本專案只考慮輸入合乎...