對一棵二叉樹進行遍歷,我們可以采取3中順序進行遍歷,分別是前序遍歷、中序遍歷和后序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設父節點是N,左節點是L,右節點是R,那么對應的訪問遍歷順序如下:
- 前序遍歷 N->L->R
- 中序遍歷 L->N->R
- 后序遍歷 L->R->N
所以,對於以下這棵樹,三種遍歷方式的結果是:

- 前序遍歷 ABCDEF
- 中序遍歷 CBDAEF
- 后序遍歷 CDBFEA
現在我們知道前序ABCDEF和中序遍歷 CBDAEF,欲求后序遍歷的。思路如下。
第一步,由前序遍歷第一個值為A,中序遍歷A的左邊為CBD,右邊為EF得知二叉樹的基本結構為: A為根節點,A的左邊有CBD,右邊有EF
第二部,對A的左邊進行處理,A的左邊三個字母的前序遍歷為BCD,中序遍歷為CBD,按照第一步可得,B為BCD三個字母的跟節點,B的左邊為C,右邊為D。
第三部,對A的右邊進行處理,原理和左邊處理類似。
總結來說就是使用遞歸處理。下面是Java實現的代碼
package mianshiti; /** * Test2 * create by chenshihang on 2018/8/21 */ public class Test2 { //根據前序遍歷fstr,和中序遍歷mstr得到二叉樹根節點 public static TreeNode method1(String fStr,String mStr){ TreeNode treeNode = new TreeNode(fStr.charAt(0),null,null); if(fStr.length()==1){ return treeNode; } String[] strings = method2(fStr, mStr); if(strings[2] != null && strings[2].length() != 0){ treeNode.lNode = method1(strings[0],strings[2]); } if(strings[3]!=null && strings[3].length() != 0){ treeNode.rNode = method1(strings[1],strings[3]); } return treeNode; } //根據前序fstr,中序mstr得出該節點的左子樹前序stirng[0],中序string[2],右子樹前序string[1],中序string[3] public static String[] method2(String fStr,String mStr){ String[] result = new String[4]; if(fStr.length()==1){ return result; } String[] middleSplit = new String[2]; mStr.split(fStr.charAt(0)+""); middleSplit[0]=mStr.split(fStr.charAt(0)+"")[0]; if (mStr.split(fStr.charAt(0)+"").length==1){ middleSplit[1]=""; }else { middleSplit[1] = mStr.split(fStr.charAt(0)+"")[1]; } int middleLeftCount = middleSplit[0].length(); String[] frontSplit = new String[2]; frontSplit[0] = fStr.substring(1,middleLeftCount+1); frontSplit[1] = fStr.substring(middleLeftCount+1); result[0] = frontSplit[0]; result[1] = frontSplit[1]; result[2] = middleSplit[0]; result[3] = middleSplit[1]; return result; } //傳入二叉樹的根節點,后序遍歷輸出節點的值 public static void method3(TreeNode rootNode){ if(rootNode.lNode!=null){ method3(rootNode.lNode); } if(rootNode.rNode!= null){ method3(rootNode.rNode); } System.out.println(rootNode.value); } public static void main(String[] args) { TreeNode rootNode = method1("ABCDEF","CBDAEF"); method3(rootNode); } } class TreeNode{ public char value; public TreeNode lNode; public TreeNode rNode; public TreeNode(char value, TreeNode lNode, TreeNode rNode) { this.value = value; this.lNode = lNode; this.rNode = rNode; } }
運行結果: