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

本文介绍了二叉树的前序、中序和后序遍历,并通过具体例子展示了如何根据前序和中序遍历结果推导出后序遍历结果。文中还提供了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;
    }
}

 

运行结果:

 

 

转载于:https://www.cnblogs.com/cavinchen/p/9512600.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值