在Java中检索给定树中的所有节点

时间:2015-11-08 20:47:04

标签: java algorithm recursion tree avl-tree

我试图创建一个方法来收集作为参数传递的给定树中的所有节点,但似乎它没有读取任何节点的左分支。

到目前为止我开发的代码如下:

private ArrayList<T> collect(AVLTree<T> tree, AVLNode<T> tRoot, ArrayList<T> l) {

    ArrayList<T> nodes = l;

    if (tRoot == null)
        return null;

    else {
        if (!nodes.contains(tRoot.element())) {
            nodes.add(tRoot.element());

            if (tRoot.getRight() != null) {
                collect(tree, tRoot.getRight(), nodes);
                return nodes;
            }

            else if (tRoot.getLeft() != null) {
                collect(tree, tRoot.getLeft(), nodes);
                return nodes;
            } 
        }
    }

    return nodes;

}

希望你能帮我解决这个问题,因为我现在真的坚持了下来......

1 个答案:

答案 0 :(得分:2)

使代码无效的两件事。

  1. 您只检查任何节点的一个分支,这意味着如果正在检查右分支,左边的分支将不会在左边有节点
  2. 你太早回来了。在检查每个分支后,您不需要立即返回。通过这样做,如果存在右分支,您将再次跳过左分支。
  3. 以下修复程序将起作用。

    --------------------------------------------------------
     method                  time(s)           peak memory
    --------------------------------------------------------
    file_get_contents          0.5              2,721,576
    sha1_file                  1.86               142,960
    mdf5_file                  1.6                142,848
    

    编辑:稍微盯着代码。存在代码冗余的地方很少。它们可以简化并清理到以下内容:

    private ArrayList<T> collect(AVLTree<T> tree, AVLNode<T> tRoot, ArrayList<T> l) {
    
        ArrayList<T> nodes = l;
    
        if (tRoot == null)
            return null;
    
        else {
            if (!nodes.contains(tRoot.element())) {
                nodes.add(tRoot.element());
    
                if (tRoot.getRight() != null) {
                    collect(tree, tRoot.getRight(), nodes);
                }
    
                if (tRoot.getLeft() != null) {
                    collect(tree, tRoot.getLeft(), nodes);
                } 
            }
        }
    
        return nodes;
    
    }