对一棵二叉树进行遍历,我们可以采取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; } }
运行结果: