示例#1
0
        private void RotateLeft(TreeNode node, TraceNode parent)
        {
            var parentNode = parent.Node;

            parentNode.Right = node.Left;
            node.Left        = parentNode;

            if (parent.Parent != null)
            {
                if (parent.Dir == Direction.Left)
                {
                    parent.Parent.Left = node;
                }
                else
                {
                    parent.Parent.Right = node;
                }
            }
            else // root
            {
                Root = node;
            }
        }
示例#2
0
        private void BalanceNode(TraceNode tn)
        {
            var curNode = tn.Node;

            var bf = GetBalanceFactor(curNode);

            if (bf == 2)
            {
                var left = curNode.Left;
                var sbf  = GetBalanceFactor(left);
                if (sbf == -1) // left-right tree
                {
                    RotateLeft(left.Right, new TraceNode()
                    {
                        Node = left, Parent = curNode, Dir = Direction.Right
                    });
                }

                // left-left tree
                RotateRight(left, tn);
            }
            else if (bf == -2)
            {
                var right = curNode.Right;
                var sbf   = GetBalanceFactor(right);
                if (sbf == 1) // right-left tree
                {
                    RotateRight(Root.Left.Left, new TraceNode()
                    {
                        Node = right, Parent = curNode, Dir = Direction.Left
                    });
                }

                // right-right tree
                RotateLeft(right, tn);
            }
        }