Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#]Двоичное дерево поиска, Поворот дерева 
V
    Опции темы
spirit1992
Дата 28.4.2013, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



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

Код

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));
        }
    
    }
     
}
 


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.