括号表示法二叉树转化为普通二叉树

3

大家好,我正在编写一个程序,该程序接收二叉树的字符串表示形式并将其创建为一棵树。虽然代码对我来说非常清晰,但它仍然不能按照预期工作。谢谢大家。以下是一些代码:

(((()B(C))D(E))F(G))J(()K((L)M(T)))

private static BinTree<String> findRoot(String s){
String tree = s;
    int i = 0;
    int count = 0;
    String root;
    if(tree.equalsIgnoreCase("()")){
        return null;
    }
    if(tree.length()==3){
        return new BinTree<String>(Character.toString(tree.charAt(1)));
    }
    while(i<tree.length()){
        if(tree.charAt(i)=='('){
            count++;
        }
        if(tree.charAt(i)==')'){
            count--;
            if(count==0){
                i++;
                root = Character.toString(tree.charAt(i));
                return new BinTree<String>(root, findRoot(tree.substring(1, i-1)), findRoot(tree.substring(i+1)));
            }
        }
        i++;
    }
    return null;
}

你的树结构是(左)根(右)吗? - shoebox639
3个回答

1

通过检查每次调用findRoot()s的值来开始调试。代码看起来不错,只是我有一种感觉你在substring()参数中存在一个偏移量错误。


0

我看到当你找到根节点后,你会递归地在根节点左侧和右侧的所有内容上调用findRoot。或者至少是这样想的。对于左子节点的调用会移除其周围的括号,但右子节点则不会。由于通过检查字符串长度为3来找到叶节点,因此您需要保留括号。因此,左子节点的调用应该是:findRoot(tree.substring(0, i)


0

抱歉:我的声望不够高,无法直接评论,所以我需要通过这个回答来提问。

上述字符串“((((B(C))D(E))F(G))J(()K((L)M(T))))”是否是二叉树的表示形式。如果是,您能否用文字形式提供一些树的部分内容?只需要几个叶子节点即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接