如何递归地将列表转换为BSTree?

时间:2012-01-20 07:26:05

标签: java recursion binary-search-tree

我尝试将列表从3 {1 {,2 {,}},5 {4 {,},6 {,}}}转换为 像这样的二叉树

               3
           1       5
             2    4  6

我认为使用递归会更容易,但我会陷入困境。

public void ListToTree (ArrayList al) {
    Iterator it = al.iterator(); 
    // n is the Tree's root
    BSTnode n = new BSTnode(it.next());
    recurse(al,it,n); 

}

void recurse (ArrayList al, Iterator it, BSTnode n) {
    if(!it.hasNext()) return;
    Object element = it.next();
    if(element=="{"){
            recurse(al,it,n.left());
            return;
    } else if (element==",") {
            recurse(al,it,n.right());
            return;
    } else if (element =="}") {

    }

}

我不知道如何继续,并想知道这是否是正确的轨道。请给我一些提示如何解决它。而且,我意识到我经常陷入递归问题。是因为我总是要打破它吗?我应该只考虑自上而下并仔细检查它是否正确?提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先:你绑定那个可怕的列表表示吗?您可以使用以下代码轻松地基于BST规则构建BST:

void insert(Node n, int value) {
     if(n == null) {
           n = new Node(value);
     } else if(value < n.value) {
           if(n.left == null) {
               n.left = new Node(value);
               return;
           }
           insert(n.left, value);
     } else if(value > n.value) {
           if(n.right == null) {
                n.right = new Node(value);
                return;
           }
           insert(n.right, value);
     }
}

你真的不必通过迭代器。只需使用列表中的值即可。此外,通常不建议在方法签名中使用实现类型。 (即ArrayList - &gt; List)。
这里的另一个重大错误是您不使用==进行值比较,即用于参考比较。请改用equals,但是你应该在测试实例之后转发对象,例如:

if( element instanceof String) {
    String seperator = (String)element;
    if("{".equals(separator))
         //do sth...

从代码中你遗漏的东西是实际的插入和向后导航 通过使用{-s和-s导航找到正确的子树后,检查元素是否为整数,然后将其设置为当前节点的值。向后导航应该在}分支中,通过从recusion返回一个级别和一些技巧或在实际节点的父级上调用方法。
但我不建议您遵循这个方向,只使用列表中的值和简单的插入方法要容易得多。