表達樹—構建表達式樹、獲取表達式(二)


回顧二叉樹的遞歸遍歷

  •   前序遍歷:訪問根結點-->前序遍歷根結點的左子樹-->前序遍歷根結點的右子樹。
  •   中序遍歷:中序遍歷根結點的左子樹-->訪問根結點-->中序遍歷根結點的右子樹。
  •   后序遍歷:后序遍歷根結點的左子樹-->后序遍歷根結點的右子樹-->訪問根結點。

二叉樹遞歸遍歷獲得表達式

  假設,已知中綴表達式為:(A+B*C)/D,需要獲得前綴表達式,后綴表達式。

  

  總結:表達樹的前序遍歷為前綴表達式,中序遍歷為中綴表達式,后續遍歷為后綴表達式。

  •   前綴表達式(前序遍歷):/+A*CBD。
  •   中綴表達式(中序遍歷):A+B*C/D。
  •     后綴表達式(后序遍歷):ACB*+D/。

利用后綴表達式構建表達式樹

  后綴表達式:ACB*+D/。

  算法思想:

  1. 依次讀取字符。
  2. 如果該符號是操作數,創建操作數結點並且入棧。
  3. 如果該符號為操作符,把棧頂T1、T2相繼出棧,創建操作符結點,操作符結點的左右孩子分別為T1、T2,最后把操作符結點入棧。

Java代碼實現構建過程

  二叉鏈表結構

//二叉樹節點
public class BinaryTreeNode { private int data; private BinaryTreeNode left; private BinaryTreeNode right; 

}

   算法實現

public class ExprTree { //最后訪問頭結點
    public BinaryTreeNode buildExprTree(char postfixExpr[],int size){ LinkedList<BinaryTreeNode> stack=new LinkedList(); BinaryTreeNode node=null; for(int i=0;i<size;i++){ if(isOperateNum(postfixExpr[i])){ node=new BinaryTreeNode(); node.setLeft(null); node.setRight(null); node.setData(postfixExpr[i]); stack.push(node); }else{ BinaryTreeNode leftChild=stack.pop(); BinaryTreeNode rightChild=stack.pop(); node =new BinaryTreeNode(); node.setLeft(leftChild); node.setRight(rightChild); node.setData(postfixExpr[i]); stack.push(node); } } return stack.getLast(); } 
</span><span style="color: #008000;">//</span><span style="color: #008000;">判斷是否是操作數</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> isOperateNum(<span style="color: #0000ff;">char</span><span style="color: #000000;"> c){
    </span><span style="color: #0000ff;">if</span>(c=='/'||c=='+'||c=='*'||c=='-'<span style="color: #000000;">){
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}

}

 發散思考-更進一步

  1. 我們肯定會思考,為什么選用后綴表達式構建?而不選擇前綴表達式、后綴表達式呢?源於各表達式結構,采用后綴表達式更容易實現構建。
  2. 如果已知前綴表達式、中綴表達式,怎么辦呢?曲線救國,先把前綴表達式、中綴表達式轉換成后綴表達式去構建,否則只能利用棧的相關算法實現。
  3. 總結:所有的解決方案沒有獨步天下,只有適合某一個場景下。若碰見前綴表達式,求其他中綴、后綴,那就用棧的算法實現吧。
  4. 利用棧轉換表達式參考:http://www.cnblogs.com/qiuyong/p/6790290.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM