AVL Balanced Tree - 打印最后10个节点

时间:2012-05-07 16:47:13

标签: java avl-tree

我有一个用Java编写的BST AVL,我需要通过打印最后十个节点来平衡。我的hack-y解决方案是,知道节点的数量,从有序遍历的最后10个节点获取值。它没有按预期工作。记录使用姓氏密钥存储(不保留重复记录),每个节点大小的打印输出结果为0。 我的打印输出大多数是'Z'名称...正如预期的那样,然后它还包含打印输出的第一个记录(26000)。我猜(希望)这是我设计打印输出的问题,而不是树中的错误?是否有一种更优雅的方式来打印最后10个节点,这不会产生我现在的错误,或者我的树轮转中是否存在缺陷?

InOrder遍历和输出:(通过get函数访问输出)

public void inOrder(Node x)
{
    if (x == null)
        return; //stops recursion when there is no Node
    inOrder(x.left); //always traverse left first
    inOrder(x.right); //traverse right

    inOrderTraversalOutput += Integer.toString((size(x.left))  + 
(size(x.right))) + "\n"; 

    bstNodes++;
    //total nodes - 17151
    if (bstNodes > 17145)
        lastnodes += x.val.toString() + "Node left size: " + 
size(x.left) + "\n" + "Node right size: " + size(x.right) + 
"\n" + "----------------------------------------------------\n";

}
//modified to print total number of nodes
public String getTraversal()
{
    inOrderTraversalOutput += Integer.toString(bstNodes) + "\n";
    return inOrderTraversalOutput;
}

put方法:(通过传递根节点,键和值的方法调用)

private Node put(Node x, Key key, Value val)
{
    if (x == null)
    {
        return new Node(key, val, 0);
    }

    int cmp = key.compareTo(x.key);

    if (cmp < 0)
    {
        x.left = put(x.left, key, val);

        //AVL Balance
        if ((size(x.left) - size(x.right)) >= 2)
            {
                if (x.key.compareTo(x.left.key) < 0)
                {
                    x = rotateWithLeftsapling(x);
                } else
                {
                    x = doubleWithLeftsapling(x);
                }
        }

    } else if (cmp > 0)
    {
        x.right = put(x.right, key, val);

        //AVL Balance
        if ((size(x.right) - size(x.left)) >= 2)
        {
            if (x.key.compareTo(x.right.key) > 0)
            {
                x = rotateWithRightsapling(x);
            } else
            {
                x = doubleWithRightsapling(x);
            }
        }
    } else
    {
        x.val = val;
    }

    x.N = size(x.left) + size(x.right);
    return x;
}

1 个答案:

答案 0 :(得分:1)

看起来你正在进行邮政订单遍历。按顺序执行所有“工作”应该在调用顺序(左)和顺序(右)之间发生。我想如果你解决了这个问题,你就可以了。

实际上,你 实际完成了根节点的工作,所以我希望它能打印出来。