我有一个用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;
}
答案 0 :(得分:1)
看起来你正在进行邮政订单遍历。按顺序执行所有“工作”应该在调用顺序(左)和顺序(右)之间发生。我想如果你解决了这个问题,你就可以了。
实际上,你 实际完成了根节点的工作,所以我希望它能打印出来。