【问题标题】:How to convert a list to BSTree recursively?如何递归地将列表转换为 BSTree?
【发布时间】:2012-02-14 19:41:54
【问题描述】:

我尝试从 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 =="}") {

    }

}

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

【问题讨论】:

    标签: java recursion binary-search-tree


    【解决方案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 -> 列表)。
    这里的另一个大错误是你没有使用 == 进行值比较,即参考比较。请改用 equals,但您应该在 instanceof 测试后向下转换 Object,例如:

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

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

    【讨论】:

    • 感谢您的建议。最初的问题是试图将树的结构记住到输出中(我选择它到一个列表中,而签名就是我在那里呈现的东西 parent{leftchild{},rightchild{}} 这就是为什么我想让它进入场景。
    • 不幸的是我不太明白你的第二句话......所以你选择了列表和结构? (您可以轻松地将二叉树放入一个数组中,其中 a[0] 是根,a[2k+1] 是左子,a[2k+2] 是右子。k 是表示父节点的正整数-s 索引)。因此,即使您使用 {} 表示,您仍然不应该传递迭代器。在这种情况下,您需要一个 FSM 解析器。询问您是否需要更多帮助。
    • 是的,你是对的。我完全忘记了数组表示!感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多