解析树字符串并输出中序遍历

题目描述

输入二叉树字符串,如“a{b{d{g,},e{,f}},c{,h{i,j{k,l}}}}”,节点都是以小写字母表示,请按照中序遍历的顺序输出。

思考

根据题目描述,可以将解决问题的过程分为两个步骤,首先解析字符串转存为树,然后就是实现中序遍历。

那么首先开始解析字符串。

public String[] parseToTree(String str) {
        /**
         * 思路:这里以数组存储树结构,左子节点为2*i+1,右子节点为2*i+2,这里不做详细解析;
         *   这里重要的是注意三个字符“{”,“,”和“}”,当看见左花括号,那么下一个字母必为上一个
         *   字母的左子节点,而看见逗号,那么下一个字母必是右子节点,而遍历到右花括号时,应当
         *   将下标回退到父节点。
         */
        String[] tree = new String[60];
        int index = 0;
        for (int i=0;i<str.length();i++) {
            String c = str.substring(i, i + 1);
            if (c.matches("[a-z]"))
                //字母写入数组
                tree[index] = c;
            else if (c.equals("{"))
                //左子节点,下标指向左子节点位置
                index = 2*index+1;
            else if (c.equals(","))
                //右子节点,下标指向右子节点位置
                index ++;
            else if (c.equals("}"))
                //回退,退到父节点的位置
                index = index/2-1;
        }
        return tree;
    }

解析字符串解决了,接下来解决中序遍历的问题。

//首先使用递归实现,这里就很容易理解了
public String inorderRecurrent(String[] tree,int i) {
        String c = "";
        if (i >= tree.size())
            return c;
    	//获取值
        c = tree[i];
    	//按照左中右的顺序
        return inorderRecurrent(tree,2*i+1) + c + inorderRecurrent(tree,2*i+2);
    }

这样就基本可以解决这个问题了,但是当字符串变长时,这里的数组长度就得重新定义,而且递归遍历是耗费存储空间的,所以这里先留两个坑。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值