C# 尝试复制AVL平衡算法(如维基百科所示)
目前我正在做一些关于AVL树和RB树的练习学习/编码。在查看了上面描述的平衡算法之后,我尽了最大努力在C#中复制它,但得到的结果好坏参半。如果我加上(2,1,0,-1),它会正确地平衡。如果我插入-2,它会平衡,但是0成为根,我在左侧得到-2和-1,在右侧得到1和2。如果做得正确,我应该得到1仍然是根,在左边我有-1,它有-2作为左子级,0作为右子级。我已经仔细检查了我的旋转,它们是按应该的方式实现的C# 尝试复制AVL平衡算法(如维基百科所示),c#,algorithm,tree,binary-search-tree,avl-tree,C#,Algorithm,Tree,Binary Search Tree,Avl Tree,目前我正在做一些关于AVL树和RB树的练习学习/编码。在查看了上面描述的平衡算法之后,我尽了最大努力在C#中复制它,但得到的结果好坏参半。如果我加上(2,1,0,-1),它会正确地平衡。如果我插入-2,它会平衡,但是0成为根,我在左侧得到-2和-1,在右侧得到1和2。如果做得正确,我应该得到1仍然是根,在左边我有-1,它有-2作为左子级,0作为右子级。我已经仔细检查了我的旋转,它们是按应该的方式实现的 public void Add(int data) { Nod
public void Add(int data)
{
Node newItem = new Node(data);
if (root == null)
{
root = newItem;
}
else
{
RecursiveInsert(root, newItem);
}
n++;
Balance_Tree(root);//Balance_Tree is called HERE
}
private void RecursiveInsert(Node current, Node n)
{
if (n.data < current.data)
{
if (current.left == null)
{
current.left = n;
}
else { RecursiveInsert(current.left, n); }
}
if (n.data > current.data)
{
if (current.right == null)
{
current.right = n;
}
else { RecursiveInsert(current.right, n); }
}
}
private void Balance_Tree(Node current)
{
Node P;
if (Balance_Factor(current) == 2)//left column
{
P = current.left;
if (Balance_Factor(P) == -1)
{
root = RotateLeftRight(P);//left right case
}
else
{
root = RotateLeftLeft(current);//left left case
}
}
if (Balance_Factor(current.left) == -2)//right column
{
P = current.right;
if (Balance_Factor(P) == 1)
{
root = RotateRightLeft(P);//right left case
}
else
{
root = RotateLeftLeft(current);//right right case
}
}
}
private int Balance_Factor(Node current)
{
int left_h = GetLeftHeight(current);
int right_h = GetRightHeight(current);
int b_factor = left_h - right_h;
return b_factor;
}
private int GetLeftHeight(Node current)
{
int l_h = 0;
while (current != null)
{
current = current.left;
l_h++;
}
return l_h;
}
private int GetRightHeight(Node current)
{
int r_h = 0;
while (current != null)
{
current = current.right;
r_h++;
}
return r_h;
}
private Node RotateLeftLeft(Node Parent)
{
Node pivot = Parent.left;
Parent.left = pivot.right;
pivot.right = Parent;
return pivot;
}
private Node RotateRightRight(Node Parent)
{
Node pivot = Parent.right;
Parent.right = pivot.left;
pivot.left = Parent;
return pivot;
}
public void Add(整数数据)
{
节点newItem=新节点(数据);
if(root==null)
{
root=newItem;
}
其他的
{
递归插入(根,新项);
}
n++;
Balance_Tree(root);//这里调用Balance_Tree
}
私有void RecursiveInsert(节点当前,节点n)
{
如果(n.数据<当前数据)
{
if(current.left==null)
{
当前左=n;
}
else{RecursiveInsert(current.left,n);}
}
如果(n.数据>当前数据)
{
if(current.right==null)
{
current.right=n;
}
else{RecursiveInsert(current.right,n);}
}
}
私有无效余额树(节点当前)
{
节点P;
if(平衡系数(当前)==2)//左栏
{
P=当前左;
如果(平衡系数(P)=-1)
{
root=RotateLeftRight(P);//左右大小写
}
其他的
{
root=RotateLeftLeft(当前);//左格
}
}
if(Balance_Factor(current.left)=-2)//右列
{
P=当前。右侧;
如果(平衡系数(P)==1)
{
root=rotaterRightLeft(P);//左右格
}
其他的
{
root=RotateLeftLeft(当前);//右-右大小写
}
}
}
专用整数平衡因子(节点当前)
{
int left_h=GetLeftHeight(当前);
int right_h=GetRightHeight(当前);
int b_因子=左_h-右_h;
返回b_因子;
}
私有int GetLeftHeight(当前节点)
{
int l_h=0;
while(当前!=null)
{
current=current.left;
l_h++;
}
返回l_h;
}
私有int GetRightHeight(当前节点)
{
int r_h=0;
while(当前!=null)
{
current=current.right;
r_h++;
}
返回r_h;
}
私有节点RotateLeftLeft(节点父节点)
{
节点枢轴=Parent.left;
Parent.left=pivot.right;
pivot.right=父对象;
返回轴;
}
专用节点RotateRightRight(节点父节点)
{
节点枢轴=Parent.right;
Parent.right=pivot.left;
pivot.left=父对象;
返回轴;
}
您能发布调用平衡树的代码吗?如果你有{0,{1,-2},{1,2}它是平衡的,{1,{1,{2},{0,{2}}是不平衡的。就像我在回答中提到的,我需要你为我回答一个问题:你如何更新你的平衡因子?此外,请发布你的RecursiveInsert
函数。我已经用RecursiveInsert函数和Balance\u Factor函数更新了我发布的示例代码,这样你就可以看到我如何更新Balance Factor了。