已知二叉树的前序中序遍历,求该二叉树的后续遍历-附Java代码实现


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

 

运行结果:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM