Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C#]Двоичное дерево поиска


Автор: spirit1992 28.4.2013, 11:34
Я написал класс двоичного дерева поиска. Но возникла проблема с методами "поворачивающима дерево вокруг узла". Вместо поворота узел, который  должен повернуться - удаляется. как решить эту проблему ?(как правильно поворачивать дерево вокруг узла?)

Код

using System;

namespace Tree
{
    public class TreeNode
    {
        public int value;
        public TreeNode LeftChild;
        public TreeNode RightChild;

        public TreeNode(int value) { this.value = value; }
        public TreeNode() : this(0) { }
    }
  
    public class BinarySearchTree
    {
        public TreeNode root;
        public BinarySearchTree() { this.root = null; }
        
        //////////////////////////////////////////////////////////////////////////
        //Основные функции
        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// функция вставки элемента в дерево
        /// </summary>
        /// <param name="insert_value"></param>
        public void Insert(int insert_value)
        {
            if (Find(insert_value) == null)
                Insert(ref this.root, insert_value);
        }
        /// <summary>
        /// функция удаления элемента из дерева
        /// </summary>
        /// <param name="deleted_value"></param>
        public void Delete(int deleted_value)
        {
            if (Find(deleted_value) != null)
                Delete(ref this.root, deleted_value);
        }
        
        /// <summary>
        /// функция нахождения элемента в дереве
        /// </summary>
        /// <param name="find_value"></param>
        /// <returns></returns>
        public TreeNode Find(int find_value) 
        { 
            return Find(this.root, find_value); 
        }
        
        
        /// <summary>
        /// функции поворота дерева
        /// </summary>
        /// <param name="rootNode"></param>
        public void Left_rotate( ref TreeNode rootNode)
        {
            TreeNode tmp = rootNode.RightChild;
            rootNode.RightChild = tmp.LeftChild;
            tmp.LeftChild = rootNode;
            rootNode = tmp;
        }
        public void Right_rotate(ref TreeNode rootNode)
        {
            TreeNode tmp = rootNode.LeftChild;
            rootNode.LeftChild = tmp.RightChild;         
            tmp.RightChild = rootNode;
            rootNode = tmp;
        }
        /// <summary>
        /// функция вычисления высоты дерева
        /// </summary>
        /// <returns></returns>
        public int Height()
        {
            return Height(this.root);
        }
        
        //////////////////////////////////////////////////////////////////////////
        //Вспомогательные функции
        //////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// функция удаления элемента
        /// </summary>
        /// <param name="rootNode"></param>
        /// <param name="deleted_value"></param>

        private void Delete(ref TreeNode rootNode, int deleted_value)
        {
            if (rootNode != null)
            {
                if (deleted_value < rootNode.value)
                    Delete(ref rootNode.LeftChild, deleted_value);
                else if (deleted_value > rootNode.value)
                    Delete(ref rootNode.RightChild, deleted_value);
                else 
                {
                    if (rootNode.LeftChild == null && rootNode.RightChild == null)
                        rootNode = null;
                    else if (rootNode.LeftChild != null && rootNode.RightChild == null)
                        rootNode = rootNode.LeftChild;
                    else if (rootNode.LeftChild == null && rootNode.RightChild != null)
                        rootNode = rootNode.RightChild;
                    else // two children
                    {
                        if (rootNode.RightChild.LeftChild == null)
                        {
                            rootNode.RightChild.LeftChild = rootNode.LeftChild;
                            rootNode = rootNode.RightChild;
                        }
                        else
                        { 
                            rootNode.value = FindMin(rootNode.RightChild).value;
                            Delete(ref rootNode.RightChild, rootNode.value);
                        }
                    } // two children
                } // valu == rootNode.data
            } // rootNode != null
        }

        /// <summary>
        /// функция добалвения элемента
        /// </summary>
        /// <param name="rootNode"></param>
        /// <param name="insert_value"></param>
        private void Insert(ref TreeNode rootNode, int insert_value)
        {
            if (rootNode == null)
                rootNode = new TreeNode(insert_value);
            else if (rootNode.value > insert_value)
                Insert(ref rootNode.LeftChild, insert_value);
            else //if (rootNode.value < insert_value)
                Insert(ref rootNode.RightChild, insert_value);
        }
        
        /// <summary>
        /// функцияя поиска элемента
        /// </summary>
        /// <param name="rootNode"></param>
        /// <param name="find_value"></param>
        /// <returns></returns>
        private TreeNode Find(TreeNode rootNode, int find_value)
        {
            if (rootNode == null)
                return null;
            else if (rootNode.value > find_value)
                return Find(rootNode.LeftChild, find_value);
            else if (rootNode.value < find_value)
                return Find(rootNode.RightChild, find_value);
            else
                return rootNode;
               
        }

        /// <summary>
        /// функция нахождения минимального элемента
        /// </summary>
        /// <param name="rootNode"></param>
        /// <returns></returns>
        private TreeNode FindMin(TreeNode rootNode)
        {
            if (rootNode != null)
            {
                while (rootNode.LeftChild != null)
                    rootNode = rootNode.LeftChild;
            }
            return rootNode;
        }
        /// <summary>
        /// функция нахождения высоты
        /// </summary>
        /// <param name="rootNode"></param>
        /// <returns></returns>
        private int Height(TreeNode rootNode)
        {
            if (rootNode == null)
                return 0;
            else if (rootNode.LeftChild == null && rootNode.RightChild == null)
                return 0;
            else
                return 1 + Math.Max(Height(rootNode.LeftChild), Height(rootNode.RightChild));
        }
    
    }
     
}
 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)