我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。
根据规范,该功能按以下方式工作:
rebalance()方法应创建一个平衡树,从而将偏度降低到零。一个 平衡树是左右子树的大小相差不超过1的树, 整个树(即每个子树也是平衡的)。
要平衡树,rebalance()方法应重复将根值移动到较小的值 子树,并将最小/最大值从较大的子树移动到根,直到树平衡。 然后应该递归地平衡两个子树。
到目前为止,我有以下代码:
struct treeNode {
Type value;
int count;
treeNode* left;
treeNode* right;
};
treeNode* root;
template <class Type>
void bstree<Type>::rebalance(treeNode* sroot){
if (root == NULL) {
throw new underflow_error("tree is empty");
}
while (skewness(sroot) != 0)
{
if (size(sroot->left) < size(sroot->right))
{
sroot->left.insert(sroot->value);
sroot->left.insert(max(sroot->right));
sroot->left.insert(min(sroot->right));
}
else
{
sroot->right.insert(sroot->value);
sroot->left.insert(max(sroot->left));
sroot->left.insert(min(sroot->left));
}
}
rebalance(sroot->left);
rebalance(sroot->right);
}
我无法判断我是否正确遵守了规格。我可以获得一些见解或指示,因为我可能做错了吗?