这个代码将String对象添加到二叉树中吗?我该如何调试这个数据结构?

时间:2016-11-21 00:29:34

标签: java data-structures

我不确定这种添加方法是否有效,因为我真的不知道如何检查以确保它已被添加到正确的位置。

1.这种方法有什么问题吗?
2.如何测试二叉树数据结构(如果对象被添加到适当的位置)? 3.这可以通过递归来完成吗? 4.如果是,使用循环或递归会更好吗?

public boolean add(String item) {
    Node tempNode = this.root;

    if (root == null) {
        root = new Node(item);
        return true;
    }

    while (tempNode.getItem().compareTo(item) == 0 || tempNode.getItem().compareTo(item) > 0 || tempNode.getItem().compareTo(item) < 0) {
        if (tempNode.getItem().compareTo(item) == 0) {
            if (tempNode.getLeftChild() == null) {
                tempNode.setLeftChild(new Node(item));
                return true;
            } else if (tempNode.getRightChild() == null) {
                tempNode.setRightChild(new Node(item));
                return true;
            } else if (tempNode.getLeftChild() != null) {
                tempNode = tempNode.getLeftChild();
            } else if (tempNode.getRightChild() != null) {
                tempNode = tempNode.getRightChild();
            }
        } else if (tempNode.getItem().compareTo(item) > 0) {
            if (tempNode.getLeftChild() == null) {
                tempNode.setLeftChild(new Node(item));
                return true;
            } else {
                tempNode = tempNode.getLeftChild();
            }
        } else {
            if (tempNode.getRightChild() == null) {
                tempNode.setRightChild(new Node(item));
                return true;
            } else {
                tempNode = tempNode.getRightChild();
            }
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:0)

我在您的代码中看到两个错误。

  1. 无论输入如何,你的while语句都会变成一个无限循环,幸运的是你可以删除它,因为你的内部if语句已经覆盖了所有情况。
  2. 我看到你检查root后看看它是否已经复制了它。如果在复制后更改root的值,则该副本仍为null(假设root之前为null)。我不认为这是你的意图。
  3. 其次,测试二叉树的最佳方法是尝试向其添加内容并通过遍历树将其打印出来。 (参见顺序树遍历 - 一种递归)

    第三,所有事情都可以用递归来完成,实际上用循环进行树遍历是很困难的。

答案 1 :(得分:0)

  

我将如何检查以确保它已被添加到正确的位置。

您可以在make breakpoint调用后addmake breakpoint all return statement method,然后您可以看到childs of root和{{ 1}}。通过这种方式,您可以查看整个树,并检查您插入的节点是否在childs of their child上。 至于你的代码,存在一些小缺陷。

首先 true postion必须为真


  second ,代码如下:

tempNode.getItem().compareTo(item) == 0 || tempNode.getItem().compareTo(item) > 0 || tempNode.getItem().compareTo(item) < 0 

最后 if (tempNode.getLeftChild() == null) { tempNode.setLeftChild(new Node(item)); return true; } else if (tempNode.getRightChild() == null) { tempNode.setRightChild(new Node(item)); return true; } else if (tempNode.getLeftChild() != null) { tempNode = tempNode.getLeftChild(); } else if (tempNode.getRightChild() != null) { tempNode = tempNode.getRightChild(); } 可能永远不会是else if,也就是说它与代码相同:

executed