Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试复制AVL平衡算法(如维基百科所示)_C#_Algorithm_Tree_Binary Search Tree_Avl Tree - Fatal编程技术网

C# 尝试复制AVL平衡算法(如维基百科所示)

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

目前我正在做一些关于AVL树和RB树的练习学习/编码。在查看了上面描述的平衡算法之后,我尽了最大努力在C#中复制它,但得到的结果好坏参半。如果我加上(2,1,0,-1),它会正确地平衡。如果我插入-2,它会平衡,但是0成为根,我在左侧得到-2和-1,在右侧得到1和2。如果做得正确,我应该得到1仍然是根,在左边我有-1,它有-2作为左子级,0作为右子级。我已经仔细检查了我的旋转,它们是按应该的方式实现的

    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了。