Esempio n. 1
0
 protected bool InsertNode(NodeAA root, int newData)
 {
     if (newData == root.data)
     {
         return(false);
     }
     if (newData > root.data)
     {
         if (root.right == null)
         {
             NodeAA node = new NodeAA(newData);
             root.right = node;
             return(true);
         }
         else
         {
             return(InsertNode(root.right, newData));
         }
     }
     else
     {
         if (root.left == null)
         {
             NodeAA node = new NodeAA(newData);
             root.left = node;
             return(true);
         }
         else
         {
             return(InsertNode(root.left, newData));
         }
     }
 }
Esempio n. 2
0
        protected bool BalanceNode(NodeAA node)
        {
            if (node.level > 1)
            {
                if (node.left.level == node.level - 2 || node.right.level == node.level - 2)
                {
                    Console.WriteLine("ha node 2: {0}", node.data);
                    node.level--;
                    if (node.right.level > node.level)
                    {
                        node.right.level--;
                    }
                    return(false);
                }
            }

            if (node.left != null && node.level == node.left.level)
            {
                Console.WriteLine("skew node: {0}", node.data);
                Skew(node); return(false);
                //skew node;
            }
            if (node.right != null && node.right.right != null && node.right.right.level == node.level)
            {
                Console.WriteLine("split node: {0}", node.data);
                Split(node);
                node.level++; return(false);
                //split node;
            }


            return(true);
        }
        protected int DeleteBough(TreeAA tree, NodeAA node)
        {
            NodeAA leftBestChild = FindLeftBestChild(node.left);
            NodeAA parentLBC     = SearchParent(node, leftBestChild.data);

            Console.WriteLine("parent:{0}", parentLBC.data);
            node.data = leftBestChild.data;
            if (node.data == parentLBC.data)
            {
                parentLBC.left = null;
            }
            else
            {
                parentLBC.right = null;
            }
            parentLBC.level = 1;
            if (parentLBC.left != null)
            {
                parentLBC.left.level = 1;
            }
            else
            {
                parentLBC.right.level = 1;
            }
            return(parentLBC.data);
        }
        protected bool DeleteNode(TreeAA tree, int keyDelete)
        {
            NodeAA node = SearchNode(tree.root, keyDelete);

            if (node == null)
            {
                return(false);
            }
            else
            {
                if (node.left == null && node.right == null)
                {
                    //xoa node la
                    DeleteLeaf(tree, keyDelete);
                    while (!CheckBalance(tree.root, keyDelete))
                    {
                        Console.WriteLine("root: {0}", tree.root.data);
                    }
                    return(true);
                }
                else
                {
                    int numberTest = DeleteBough(tree, node);
                    while (!CheckBalance(tree.root, numberTest))
                    {
                        Console.WriteLine("root: {0}", tree.root.data);
                    }
                    //xoa node co 2 con
                    return(true);
                }
            }
        }
 protected bool CheckBalance(NodeAA node, int newData)
 {
     if (node == null)
     {
         return(true);
     }
     else
     {
         bool check = BalanceNode(node);
         if (check)
         {
             //return CheckBalance(node.right, newData) && CheckBalance(node.left, newData);
             if (newData > node.data)
             {
                 return(CheckBalance(node.right, newData));
             }
             else
             {
                 return(CheckBalance(node.left, newData));
             }
         }
         else
         {
             return(false);
         }
     }
 }
        protected void DeleteLeaf(TreeAA tree, int keyDelete)
        {
            NodeAA nodeParent = SearchParent(tree.root, keyDelete);

            if (nodeParent != null)
            {
                if (keyDelete < nodeParent.data)
                {
                    nodeParent.left = null;
                    nodeParent.level--;
                    if (nodeParent.right.level > nodeParent.level)
                    {
                        nodeParent.right.level--;
                    }
                }
                else
                {
                    nodeParent.right = null;
                    nodeParent.level = 1;
                }
            }
            else
            {
                if (tree.root.data == keyDelete)
                {
                    tree.root = null;
                }
            }
        }
 protected void BalanceTree(NodeAA root, int newData)
 {
     while (!CheckBalance(root, newData))
     {
         ;
     }
 }
 protected NodeAA FindLeftBestChild(NodeAA nodeLeft)
 {
     if (nodeLeft.right == null)
     {
         return(nodeLeft);
     }
     else
     {
         return(FindLeftBestChild(nodeLeft.right));
     }
 }
Esempio n. 9
0
        void Skew(NodeAA P)
        {
            NodeAA Q    = P.left;
            int    temp = P.data;

            P.data  = Q.data;
            Q.data  = temp;
            P.left  = Q.left;
            Q.left  = Q.right;
            Q.right = P.right;
            P.right = Q;
        }
Esempio n. 10
0
        void Split(NodeAA P)
        {
            NodeAA Q = P.right;

            P.right = Q.right;
            Q.right = Q.left;
            Q.left  = P.left;
            P.left  = Q;
            int temp = P.data;

            P.data = Q.data;
            Q.data = temp;
        }
Esempio n. 11
0
        public bool Insert(int newData)
        {
            if (root == null)
            {
                NodeAA node = new NodeAA(newData);
                root = node;
                return(true);
            }
            bool insert = InsertTree(this, newData);

            BalanceTree(root, newData);
            return(insert);
        }
 protected bool CheckBalanceDeleteBough(NodeAA node)
 {
     if (node == null)
     {
         return(true);
     }
     else
     {
         bool check = BalanceNode(node);
         if (check)
         {
             return(CheckBalanceDeleteBough(node.left) && CheckBalanceDeleteBough(node.right));
         }
         else
         {
             return(false);
         }
     }
 }
Esempio n. 13
0
 protected NodeAA SearchNode(NodeAA node, int keySearch)
 {
     if (node == null)
     {
         return(null);
     }
     else
     {
         if (node.data == keySearch)
         {
             return(node);
         }
         if (keySearch > node.data)
         {
             return(SearchNode(node.right, keySearch));
         }
         else
         {
             return(SearchNode(node.left, keySearch));
         }
     }
 }
 protected NodeAA SearchParent(NodeAA node, int keySearch)
 {
     if (keySearch > node.data)
     {
         if (node.right != null)
         {
             if (node.right.data == keySearch)
             {
                 return(node);
             }
             else
             {
                 return(SearchParent(node.right, keySearch));
             }
         }
         else
         {
             return(null);
         }
     }
     else
     {
         if (node.left != null)
         {
             if (node.left.data == keySearch)
             {
                 return(node);
             }
             else
             {
                 return(SearchParent(node.left, keySearch));
             }
         }
         else
         {
             return(null);
         }
     }
 }
Esempio n. 15
0
        public TreeAA(int newData)
        {
            NodeAA node = new NodeAA(newData);

            root = node;
        }
Esempio n. 16
0
 public TreeAA()
 {
     root = null;
 }