中綴表達式轉化成前綴和後綴表達式-二叉樹

思路:

第一步:中序表達式--->二叉樹

第二步:對二叉樹進行前序遍歷,得到前綴表達式,對二叉樹進行後序遍歷,得到後綴表達式。

 

第一步:中序表達式轉爲二叉樹

在上篇文章棧結構與四則運算中提到了通過算術表達式構造二叉樹,比如 9+(3-1)*3+10/2 是一個標準的算術表達式,也叫中綴表達式。在通過中綴表達式構造二叉樹的過程中,計算數要作爲葉子節點,運算符作爲中間節點,考慮算術優先級。因爲正常單從一箇中綴表達式是無法獲得唯一的一個二叉樹結構的。總結來說,中綴表達式構造二叉樹有以下幾個步驟和要點:

  1. 計算數作爲葉子節點,運算符作爲中間節點。
  2. 對算式按照優先級和計算順序分割,計算數爲葉子節點,運算符爲中間節點,直到算式對應到二叉樹中。
  3. 分析過程中,可以用括號輔助分割表達式,依次分析得到左右樹節點(算式中一般常見括號,因此用豎線分隔更好些)。

如下對中綴表達式9+(3-1)*3+10/2構造二叉樹過程:
根據優先級,分爲三個部分9, +, (3-1)*3+10/2,計算數9爲左葉子,運算符+爲中間節點;
繼續分割(3-1)*3+10/2,也是三部分(3-1)*3,+,10/2,+爲根節點,左子樹爲(3-1)*3,右子樹爲10/2
繼續,先拆分左側(3-1)*3,三部分3-1,*,3,* 中間節點,3右葉子,繼續可以拆分3-1
拆分右側,對於10/2,拆分爲10,/,2,整個轉換完成。

最終的樹結構如圖

 

表達式二叉樹

第二步,前序和後序遍歷

1.前序遍歷

圖1

對於當前節點,先輸出該節點,然後輸出他的左孩子,最後輸出他的右孩子。以上圖爲例,遞歸的過程如下:
(1):輸出 1,接着左孩子;
(2):輸出 2,接着左孩子;
(3):輸出 4,左孩子爲空,再接着右孩子;
(4):輸出 6,左孩子爲空,再接着右孩子;
(5):輸出 7,左右孩子都爲空,此時 2 的左子樹全部輸出,2 的右子樹爲空,此時 1 的左子樹全部輸出,接着 1 的右子樹;
(6):輸出 3,接着左孩子;
(7):輸出 5,左右孩子爲空,此時 3 的左子樹全部輸出,3 的右子樹爲空,至此 1 的右子樹全部輸出,結束。

2.中序遍歷

對於當前結點,先輸出它的左孩子,然後輸出該結點,最後輸出它的右孩子。以上圖爲例:
(1):1-->2-->4,4 的左孩子爲空,輸出 4,接着右孩子;
(2):6 的左孩子爲空,輸出 6,接着右孩子;
(3):7 的左孩子爲空,輸出 7,右孩子也爲空,此時 2 的左子樹全部輸出,輸出 2,2 的右孩子爲空,此時 1 的左子樹全部輸出,輸出 1,接着 1 的右孩子;
(4):3-->5,5 左孩子爲空,輸出 5,右孩子也爲空,此時 3 的左子樹全部輸出,而 3 的右孩子爲空,至此 1 的右子樹全部輸出,結束。

3.後序遍歷

對於當前結點,先輸出它的左孩子,然後輸出它的右孩子,最後輸出該結點。依舊以上圖爲例:
(1):1->2->4->6->7,7 無左孩子,也無右孩子,輸出 7,此時 6 無左孩子,而 6 的右子樹也全部輸出,輸出 6,此時 4 無左子樹,而 4 的右子樹全部輸出,輸出 4,此時 2 的左子樹全部輸出,且 2 無右子樹,輸出 2,此時 1 的左子樹全部輸出,接着轉向右子樹;
(2):3->5,5 無左孩子,也無右孩子,輸出 5,此時 3 的左子樹全部輸出,且 3 無右孩子,輸出 3,此時 1 的右子樹全部輸出,輸出 1,結束。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章