前序遍历和中序遍历求后序遍历

一个二叉树
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
求其后续遍历。

求解过程

  1. 这三种遍历不知道是什么意思的请自行搜索。
  2. 通过前序遍历我们可知此树根节点为G(即前序遍历第一个字符)
  3. 观测中序遍历可知此树左子树所有节点为:ADEF 右子树所有节点为:HMZ(以根节点划分)
  4. 得到左子树的前序遍历(DAFE)中序遍历(ADEF) 顺序未变。
  5. 得到右字数的前序遍历(MHZ)中序遍历(HMZ) 顺序未变。
  6. 递归此过程,展开所有子树。

代码如下:
定义二叉树的类

view plain
public class Tree {  
     String root = "";//根节点  
     Tree left;       //左子树  
     Tree right;      //右子树  

     String pre = "";//前序遍历字符串  
     String in = "";//中序遍历字符串  
     String back = "";//后序遍历字符串  

    Tree(String s){  
        this.root = s;  
    }  

    Tree(){}     
}  
实现代码:
view plain
public class testTree {     
    public static String post = "";  

    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        String pre = "GDAFEMHZ";  
        String in = "ADEFGHMZ";  
        Tree t = new Tree();  
        t.root = in;  
        t.pre = pre;  

        build(t);  
        System.out.println(post);  


    }  


    /** 
     * 采取后序遍历递归展开所有节点 
     * @param tree 
     */  
    public static void build(Tree tree){  


        if(tree == null){  
            return;  
        }  
        open(tree);  
        if(tree.left != null){  
            open(tree.left);  
            build(tree.left);  
        }  
        if(tree.right != null){  
            open(tree.right);  
            build(tree.right);  
        }  
        post = post + tree.root;  
    }  


    /** 
     * 将节点不是单字符的节点展开 
     * @param tree 
     */  

    public static void open(Tree tree){  
        if(tree.root.length()>1){  
            String s2 = tree.root;  
            String s1 = tree.pre;  

            tree.root =s1.substring(0, 1);  
            String [] node = s2.split(tree.root);  
            if(node.length>=2){  
                tree.left = new Tree(node[0]);  
                tree.left.pre = s1.substring(1, node[0].length()+1);  
                tree.right = new Tree(node[1]);  
                tree.right.pre = s1.substring(s1.length()-node[1].length(), s1.length());  
            }    
        }  
    }    
}  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值