回顧二叉樹的遞歸遍歷
- 前序遍歷:訪問根結點-->前序遍歷根結點的左子樹-->前序遍歷根結點的右子樹。
- 中序遍歷:中序遍歷根結點的左子樹-->訪問根結點-->中序遍歷根結點的右子樹。
- 后序遍歷:后序遍歷根結點的左子樹-->后序遍歷根結點的右子樹-->訪問根結點。
二叉樹遞歸遍歷獲得表達式
假設,已知中綴表達式為:(A+B*C)/D,需要獲得前綴表達式,后綴表達式。
總結:表達樹的前序遍歷為前綴表達式,中序遍歷為中綴表達式,后續遍歷為后綴表達式。
- 前綴表達式(前序遍歷):/+A*CBD。
- 中綴表達式(中序遍歷):A+B*C/D。
- 后綴表達式(后序遍歷):ACB*+D/。
利用后綴表達式構建表達式樹
后綴表達式:ACB*+D/。
算法思想:
- 依次讀取字符。
- 如果該符號是操作數,創建操作數結點並且入棧。
- 如果該符號為操作符,把棧頂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;">;
}
}
發散思考-更進一步
- 我們肯定會思考,為什么選用后綴表達式構建?而不選擇前綴表達式、后綴表達式呢?源於各表達式結構,采用后綴表達式更容易實現構建。
- 如果已知前綴表達式、中綴表達式,怎么辦呢?曲線救國,先把前綴表達式、中綴表達式轉換成后綴表達式去構建,否則只能利用棧的相關算法實現。
- 總結:所有的解決方案沒有獨步天下,只有適合某一個場景下。若碰見前綴表達式,求其他中綴、后綴,那就用棧的算法實現吧。
- 利用棧轉換表達式參考:http://www.cnblogs.com/qiuyong/p/6790290.html