/*問題及**
*all right reserved.
*檔名稱:用二叉樹求解代數表示式.cpp
*完成日期;2023年11月13日
*版本號;v1.0
*問題描述:用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數(為簡化,只支援二目運算的+、-、*、/,不加括號,運算數也只是一位的數字字元。本專案只考慮輸入合乎以上規則的情況)。
請設計演算法,(1)根據形如「1+2?3?4/5」的字串代表的表示式,構造出對應的二叉樹(如圖),
用後序遍歷的思路計算表示式的值時,能體現出先乘除後加減的規則;
(2)對構造出的二叉樹,計算出表示式的值。
*輸入描述:代數表示式
*程式輸出:表示式對應二叉樹以及表示式的值
*/
// btree.h
#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); //銷毀二叉樹
double comp(btnode *b);
btnode *crtree(char s,int i,int j);
#include #include #include #include "btree.h"
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)
}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) //銷毀二叉樹
}
執行結果:// main.cpp
#include #include #include "btree.h"
int main()
知識點總結:
這個程式是將運算子與數字間隔開,孩子節點是數字,雙親節點是運算子,並且將高階運算子放在下面,低階的放在上面,然後後序遍歷進行訪問
心得體會:
表示式與二叉樹結合在一起這是第一次遇到
第十一周專案二 用二叉樹求解代數表示式
問題描述 用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數 為簡化,只支援二目運算的 不加括號,運算數也只是一位的數字字元。本專案只考慮輸入合乎以上規則的情況 請設計演算法,1 根據形如 1 2?3?4 5 的字串代表的表示式,構造出對應的二叉樹 如圖 用後序...
第十一周 專案二 用二叉樹求解代數表示式
問題及描述 煙台大學計算機與控制工程學院 完成日期 2016年11月10號 問題描述 1 根據形如 1 2 3 4 5 的字串代表的表示式,構造出對應的二叉樹,用後序遍歷的思路計算表示式的值時,能體現出先乘除後加減的規則。2 對構造出的二叉樹,計算出表示式的值。include include inc...
第十一周專案二 用二叉樹求解代數表示式
專案 用二叉樹求解代數表示式 用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數 為簡化,只支援二目運算的 不加括號,運算數也只是一位的數字字元。本專案只考慮輸入合乎以上規則的情況 請設計 演算法,1 根據形如 1 2 3 4 5 的字串代表的表示式,構造出對應...