コード例 #1
0
        public void delete(T val)
        {
            Node <T> node = findNode(root, val);

            if (node == null)
            {
                return;
            }
            else if (node.isLeaf())
            {
                if (node == root)
                {
                    root = null;
                }
                else if (node.Parent.Right == node)
                {
                    node.Parent.Right = null;
                }
                else
                {
                    node.Parent.Left = null;
                }
            }
            else if (node.hasOneChild())
            {
                if (node == root)
                {
                    if (node.Left != null)
                    {
                        root = node.Left;
                    }
                    else
                    {
                        root = node.Right;
                    }
                    root.Parent = null;
                }
                else if (node.Parent.Left == node)
                {
                    if (node.Left != null)
                    {
                        node.Parent.Left = node.Left;
                        node.Left.Parent = node.Parent;
                    }
                    else
                    {
                        node.Parent.Left  = node.Right;
                        node.Right.Parent = node.Parent;
                    }
                }
                else
                {
                    if (node.Left != null)
                    {
                        node.Parent.Right = node.Left;
                        node.Left.Parent  = node.Parent;
                    }
                    else
                    {
                        node.Parent.Right = node.Right;
                        node.Right.Parent = node.Parent;
                    }
                }
            }
            else if (node.hasTwoChild())
            {
                //TODO
            }
        }
コード例 #2
0
ファイル: BinaryTree.cs プロジェクト: alisengur/ds2017
        public void delete(T val)
        {
            Node<T> node = findNode(root, val);
            if (node == null)
                return;
            else if (node.isLeaf())
            {
                if (node == root)
                    root = null;
                else if (node.Parent.Right == node)
                    node.Parent.Right = null;
                else
                    node.Parent.Left = null;
            }
            else if (node.hasOneChild())
            {
                if (node == root)
                {
                    if (node.Left != null)
                    {
                        root = node.Left;
                    }
                    else
                    {
                        root = node.Right;
                    }
                    root.Parent = null;
                }
                else if (node.Parent.Left == node)
                {
                    if (node.Left != null)
                    {
                        node.Parent.Left = node.Left;
                        node.Left.Parent = node.Parent;
                    }
                    else
                    {
                        node.Parent.Left = node.Right;
                        node.Right.Parent = node.Parent;
                    }
                }
                else
                {
                    if (node.Left != null)
                    {
                        node.Parent.Right = node.Left;
                        node.Left.Parent = node.Parent;
                    }
                    else
                    {
                        node.Parent.Right = node.Right;
                        node.Right.Parent = node.Parent;
                    }
                }
            }
            else if (node.hasTwoChild())
            {
                Node<T> successor = node.Right;
                while (successor.Left != null)
                    successor = successor.Left;

                delete(successor.val);

                successor.Right = node.Right;
                successor.Left = node.Left;
                if (node.Left != null)
                    node.Left.Parent = successor;
                if (node.Right != null)
                    node.Right.Parent = successor;
                successor.Parent = node.Parent;
                if (node == root)
                    root = successor;
                else if (node.Parent.Right == node)
                    node.Parent.Right = successor;
                else if(node.Parent.Left==node)
                    node.Parent.Left = successor;
            }
        }