二叉樹的簡單應用 表示式樹

2021-08-02 01:23:16 字數 2831 閱讀 1277

算數表示式是分層的遞迴結構,乙個運算子作用於相應的運算物件,其運算物件又可以是任意複雜的表示式。二叉樹的遞迴結構正好用來表示這種表示式。下面只討論二元表示式。

二元表示式可以很自然的聯絡到二叉樹:以基本運算物件作為葉節點中的資料;以運算子作為非葉節點中的資料,其兩棵子樹是它的運算物件,子樹可以是基本運算物件,也可以是複雜表示式。如圖是乙個表示式樹。

中綴表示式(中綴記法)

我們平時縮寫的表示式,將運算子寫在兩個運算元中間的表示式,稱作中綴表示式。在中綴表示式中,運算子有不同的優先順序,圓括號用於改變運算順序,這使得運算規則比較複雜,求值過程不能直接從左到右順序進行,不利於計算機處理。

字尾表示式

將運算子寫在兩個運算元之後的表示式稱作字尾表示式。字尾表示式中沒有括號,從而運算子沒有優先順序。字尾表示式的求值過程能夠嚴格按照從左到右的順序進行,有利於計算機處理。

字首表示式

字首表示式是將運算子寫在兩個運算元之前的表示式。和字尾表示式一樣,字首表示式沒有括號,運算子沒有優先順序,能嚴格按照從右到左的順序計算。

另外,算式表示式和表示式樹的關係如下:

給定乙個表示式的中綴形式:(4+1*(5-2))-6/3

首先將每個運算加上括號,區分優先順序,得到(4+(1*(5-2)))-(6/3)

括號外的-優先順序最低,作為根節點,(4+(1*(5-2)))作為左子樹,(6/3)作為右子樹;

遞迴的轉換4+(1*(5-2)),+最為根節點,4是左子樹,(1*(5-2))是右子樹。*是右子樹的根節點,1是左子樹,(5-2)是右子樹。最後計算(5-2),-是根節點,5是左子樹,2是右子樹。得到的表示式樹如上圖。

構造好表示式樹之後,字首表示式和中綴表示式可根據先根遍歷和後根遍歷得到。

字首表示式:- + 4 * 1 - 5 2 / 6 3

字尾表示式:4 1 5 2 - * + 6 3 / -

將中綴表示式轉換為字尾表示式

step1:初始化乙個棧和乙個字尾表示式字串

step2:從左到右依次對中綴表示式中的每個字元進行以下處理,直到表示式結束

例如給定乙個表示式的中綴形式:(4+1*(5-2))-6/3,棧中和表示式的變化如下表所示:

|掃瞄到的元素|棧|字尾表示式|說明|

掃瞄到的元素

棧字尾表示式說明(

(將(入棧,表示式空4(

4將4加入表示式

+( +

4將+入棧

1( +

4 1將1加入表示式

*( + *

4 1將*入棧

(( + * (

4 1將(入棧

5( + * (

4 1 5

將5加入表示式

-( + * ( -

4 1 5

將-入棧

2( + * ( -

4 1 5 2

將2 加入表示式

)( + *

4 1 5 2 -

-出棧,加入表示式

)4 1 5 2 - * +

*和+出棧,加入表示式,棧空--

4 1 5 2 - * +

-入棧6

-4 1 5 2 - * + 6

6加入表示式/-/

4 1 5 2 - * + 6

/入棧3

-/4 1 5 2 - * + 6 3

3加入表示式

4 1 5 2 - * + 6 3 / -

表示式掃瞄結束,將棧中元素加入表示式

最後得到字尾表示式為4 1 5 2 - * + 6 3 / -

將中綴表示式轉換為字首表示式

中綴表示式轉換到字首表達的方法和轉換到字尾表示式過程一致,細節上有所變化

step1:初始化兩個棧s1 和s2

step2:從右到左依次對中綴表示式中的每個字元進行以下處理,直到表示式結束

給定乙個表示式的中綴形式:(4+1*(5-2))-6/3,其字首形式為 - + 4 * 1 - 5 2 / 6 3

中綴表示式的計算我們已經非常清楚,字首和字尾表示式更適合計算機處理

字尾表示式的計算

字尾表示式沒有括號,運算子的順序即為實際運算順序,在求值過程中,當遇到運算子時,只要取得前兩個運算元就可以立即進行計算。當運算元出現時,不能立即求值,需要先儲存等待運算子。對於等待中的運算元而言,後出現的先運算,所以需要乙個棧輔助操作。

字尾表示式的運算過程如下:

step1:設定乙個棧

step2:從左到右對字尾表示式中的字元進行以下處理:

- 如果字元是數字,現將其轉化為數字,然後入棧

- 如果字元是運算子,出棧兩個值進行計算。計算結果入棧

- 重複以上步驟,直到字尾表示式掃瞄結束,棧中最後乙個元素就是表示式的結果。

給定字尾表示式4 1 5 2 - * + 6 3 / -,依次將4 1 5 2 入棧,當掃瞄到-時,2,5出棧,計算5-2=3;將3入棧,此時棧中元素為4 1 3。接著掃瞄到*,3 1出棧,計算1*3=3,3入棧,棧中元素為4 3,。掃瞄+,3 4出棧,計算4+3=7,7入棧。接著6 3 入棧,棧中該元素為7 6 3,掃瞄到/,3 6出棧,計算6/3=2,2入棧,棧中元素為7 2.掃瞄-,2 7 出棧,計算7-2=5,5入棧。表示式掃瞄完畢,棧中元素為5,表示式結果為5.

字首表示式的計算

字首表示式的計算掃瞄順序從右到左,其他和字尾表示式的計算完全一致。

二叉樹的應用 表示式樹

假設 對於乙個運算表示式,只考慮2元運算 如加減乘除 和 運算元,我們就可以用乙個二叉樹去儲存這個表示式 用葉子結點儲存運算元,內部結點儲存運算子,這樣的二叉樹就是乙個表示式樹。由於運算子都是二元的,則這個樹實質也是乙個滿二叉樹。先序遍歷表示式樹,得到的是字首表示式 波蘭表示式 中序遍歷表示式樹,得...

07 2 二叉數,二叉樹的簡單應用 表示式樹

二叉樹的list實現 def bintree data,left none,right none 二叉樹 param data 根結點的元素 param left 左子樹元素 param right 右子樹元素 return return data,left,right defis empty bi...

棧 二叉樹 表示式 表示式樹 表示式求值

總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...