コード例 #1
0
        public bool Remove(T val)
        {
            BinaryTree <T> tree = Search(val);

            if (tree == null)
            {
                return(false);
            }

            BinaryTree <T> CurrentTree;

            if (tree == this)
            {
                if (tree.right != null)
                {
                    CurrentTree = tree.right;
                }
                else
                {
                    CurrentTree = tree.left;
                }

                while (CurrentTree.left != null)
                {
                    CurrentTree = CurrentTree.left;
                }
                T temp = CurrentTree.val;
                this.Remove(temp);
                tree.val = temp;

                return(true);
            }

            if (tree.left == null && tree.right == null && tree.parent != null)
            {
                if (tree == tree.parent.left)
                {
                    tree.parent.left = null;
                }
                else
                {
                    tree.parent.right = null;
                }
                return(true);
            }

            if (tree.left != null && tree.right == null)
            {
                tree.left.parent = tree.parent;
                if (tree == tree.parent.left)
                {
                    tree.parent.left = tree.left;
                }
                else if (tree == tree.parent.right)
                {
                    tree.parent.right = tree.left;
                }
                return(!false);
            }

            if (tree.left == null && tree.right != null)
            {
                tree.right.parent = tree.parent;
                if (tree == tree.parent.left)
                {
                    tree.parent.left = tree.right;
                }
                else if (tree == tree.parent.right)
                {
                    tree.parent.right = tree.right;
                }
                return(true);
            }

            if (tree.right != null && tree.left != null)
            {
                CurrentTree = tree.right;

                while (CurrentTree.left != null)
                {
                    CurrentTree = CurrentTree.left;
                }

                if (CurrentTree.parent == tree)
                {
                    CurrentTree.left   = tree.left;
                    tree.left.parent   = CurrentTree;
                    CurrentTree.parent = tree.parent;
                    if (tree == tree.parent.left)
                    {
                        tree.parent.left = CurrentTree;
                    }
                    else if (tree == tree.parent.right)
                    {
                        tree.parent.right = CurrentTree;
                    }
                    return(true);
                }

                else
                {
                    if (CurrentTree.right != null)
                    {
                        CurrentTree.right.parent = CurrentTree.parent;
                    }
                    CurrentTree.parent.left = CurrentTree.right;
                    CurrentTree.right       = tree.right;
                    CurrentTree.left        = tree.left;
                    tree.left.parent        = CurrentTree;
                    tree.right.parent       = CurrentTree;
                    CurrentTree.parent      = tree.parent;
                    if (tree == tree.parent.left)
                    {
                        tree.parent.left = CurrentTree;
                    }
                    else
                    {
                        tree.parent.right = CurrentTree;
                    }

                    return(true);
                }
            }
            return(false);
        }
コード例 #2
0
 public BinaryTree(T val, BinaryTree <T> parent)
 {
     this.val    = val;
     this.parent = parent;
 }