按顺序遍历三叉搜索树

时间:2014-10-13 05:24:33

标签: java algorithm tree binary-search-tree

所以,我有以下代码在三元搜索树中插入一个元素(左树少,中间相同,右树更大)

public void insert (TrinaryTree<T> root, T data) {
    //if the given tree doesn't exist yet
    if (root == null){
        root = new TrinaryTree<T>(data);
    }
    //if the given value is greater, insert to the right
    else if (root.getData().compareTo(data) > 0){
        insert (root.right, data);
    }
    //if the given value is equal, insert to the mid
    else if (root.getData().compareTo(data) == 0) {
        insert (root.mid, data);
    }
    //if the given value is less, insert to the left
    else {
        insert (root.left, data);
    }
}

然后我尝试打印出我的树(按顺序遍历以检查我所做的是否正确使用此 -

public void inorderTraversal (TrinaryTree<T> root){
    if (root != null){
        inorderTraversal(root.getLeft());
        System.out.println(root.getData());
        inorderTraversal(root.getRight());      
    }
}

现在当我尝试运行主类时,就是这个 -

public static void main (String [] args) {
    TrinaryTree<Integer> tree = new TrinaryTree<Integer>(5);
    tree.insert(tree, 4);
    tree.insert(tree, 9);
    tree.insert(tree, 5);
    tree.insert(tree, 7);
    tree.insert(tree, 2);
    tree.insert(tree, 2);       
    tree.inorderTraversal(tree);
}

我只得到输出5.我想通了,因为主树的左右子树是空的。我不确定为什么会这样。我的插入函数有效,因为我将一个print语句放入insert函数,并且语句确实打印出来。为什么子树仍为空?

1 个答案:

答案 0 :(得分:1)

查看insert的代码!一旦你用null值调用它(你想要向左或向右放置一些东西),那么很可能一切都是空的。

  • root.leftroot.right(可能)为null,您的代码不会 将新创建的节点添加到上一级节点。
  • 您调用compareTo的值可能为null(No NPE?)

最重要的是,当您使用未初始化的值(左侧或右侧)调用insert时,您的代码将创建一个TrinaryTree节点,但它无法将其添加到其中parent(您可能打算这样做),并且在方法调用之后将新创建的节点进行垃圾收集。