輸入一行中綴表達式,轉換一顆二叉表達式樹,並求解. 表達式只包含+,-,*,/,(,)運算符,操做數只有一位,且爲整數(有興趣同窗能夠考慮負數小數,兩位數作法)。按照先括號,再乘除,後加減的規則構造二叉樹。 如圖所示是"1+(2+3)*2-4/5"代數表達式對應二叉樹,用對應的二叉樹計算表達式的值。 轉換二叉樹以下:
void InitExpTree(BTree &T, string str) //建表達式的二叉樹 創建字符棧op和樹根棧node 建立樹結點p等於NULL,a,b 定義i=0表示循環變量 定義字符來存判斷兩符號的優先關係的函數返回的符號 while 表達式str未結束 if str[i] 是數字字符 then 建立樹節點p 將結點存入樹棧node中 node.push(p) else if str[i]是運算符 then if op.empty() then op.push(str[i]) //若是棧空 則將字符存進去 else f = Precede(op.top(), str[i]) //判斷兩符號的優先關係 switch f case:'>' 從樹棧node出棧兩個結點存入a,b中 調用CreateExpTree函數建立數二叉樹p併入棧 i-- break case '<':op.push(str[i]); break; //優先級比棧頂元素高 case '=':op.pop(); break; end while while 運算符棧op中不爲空且棧node也不爲空 從樹棧node出棧兩個結點存入a,b中 調用CreateExpTree函數建立數二叉樹p併入棧 end while double EvaluateExTree(BTree T) 定義浮點數sum,b,m 創建double類型的棧 num表示將每一次計算結果存進去以及取出來 創建字符棧 s表示存入的數據有運算符有數 創建樹類型的棧 node表示每次取數的結點 while T 將每一個結點的數據一個個存入s,以及將結點T存入node中 end while while s不爲空 if s的棧頂元素爲數字 then 將字符轉化爲數存入num中 else //爲運算符時候 sum=num的棧頂元素 num去棧頂元素 b=num的棧頂元素 num去棧頂元素 switch s的棧頂元素 case '+':sum += b; break; case '-':sum -= b; break; case '*':sum *= b; break; case '/': if b等於0 輸出divide 0 error!\n 關閉程序 else sum /= b; end if break s.pop(); num.push(sum); 返回sum
二叉樹葉子結點的帶權路徑長度指:葉子結點的權重路徑長度。本題要求算出二叉樹全部葉子結點的帶權路徑長度和。 以下面的二叉樹:
主要說建樹函數和計算權值的函數 BiTree create(string str, int n) 創建新的樹節點 BT if str[n] 等於字符# 返回NULL end if if n>str.size() - 1 返回NULL end if BT->data = str[n]; BT->lchild = create(str, 2 * n); //遞歸建樹 BT->rchild= create(str, 2 * n+1); 返回 BT; void GetWPL(BiTree bt,int h,int&wpl) if bt等於NULL 返回 end if if bt左右孩子不空 wpl=wpl+(bt->data-'0')*h; end if GetWPL(bt->lchild,h+1,wpl); GetWPL(bt->rchild,h+1,wpl);
A3:遞歸口設置的不對,致使最後到了空時候還進行操做致使出錯
***node
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
#include<iostream> using namespace std; int in[31], post[31]; typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; BiTree Build(int *in, int *post, int n)//第一個參數是中序序列的起始位置,第二個參數是後序序列的起始位置,n是長度 定義len, *p if n <= 0 then//若是長度小於等於0,直接返回便可 return NULL end if p = in; for pto in+n //少打了一個+n if *p == *(post + n - 1) then break end if enf for 創建新結點T T->data = *p len = p - in; T->lchild = Build(in, post, len); T->rchild = Build(p + 1, post + len, n - len - 1); 返回T void PreOrder(BiTree T) if T不爲空 then 輸出 T->data; PreOrder(T->lchild); PreOrder(T->rchild); end if return int main() 定義 n, i=0分別表示數組長度和循環變量; BiTree T;//只須要定義,不須要賦值->[BiTree T = new BiTNode;] 輸入 n for i to n do 輸入 post[i] end for for i to n do 輸入 in[i] end for T = Build(in, post, n) 輸出"Preorder:" PreOrder(T) return 0
2.再用隊列層次輸出ios