Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2012, 07:22   #1
Rei-li
 
Регистрация: 20.09.2011
Сообщений: 4
По умолчанию Обобщенная реализация двоичного дерева (C#)

Здравствуйте. Помогите пожалуйста написать обощенную реализацию двоичного дерева. Написала класс, который работает с вещественными числами, а с Generic не получается.


Пробовала сделать так:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BinaryTree
{
    class Program<T>
    {
        static void Main()
        {
            Tree<T> tr = new Tree<T>();
            tr.Input();
            tr.Print();
        }
    }
    class Node <T>
    {
        public T n;
        public Node<T> left;
        public Node<T> right;
        public Node(T num)
        {
            n = num;
            left = null;
            right = null;
        }


        public void Print()
        {
            Console.WriteLine(n);
            if (left != null)
                left.Print();
            if (right != null)
            {
                Console.Write("         ");
                right.Print();
            }
        }


        public void Add<T>(T num)
        {
            if (num <= n)
            {
                if (left == null)
                {
                    Node<T> newNode = new Node<T>(num);
                    left = newNode;
                }
                else
                {
                    left.Add(num);
                }
            }
            else
            {
                if (right == null)
                    right = new Node<T>(num);
                else
                    right.Add(num);
            }

        }

    }
    class Tree<T>
    {
        Node<T> root;
        public Tree()
        {
            root = null;
        }


        public void Input()
        {
            int y;
            int i;
            Console.WriteLine("Введите количество вершин дерева");
            y = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Введите значения вершин");
            for (i = 0; i < y; i++)
            {
                Double N;
               
                    N = Console.ReadLine();
                

                Add(N);

            }
        }
        public void Add<T>(T n)
        {
            if (root == null)
                root = new Node<T>(n);
            else
                root.Add<T>(n);
        }



        public void Print()
        {
            if (root == null)
                Console.WriteLine("Дерево пустое");

            else
            {
                Console.WriteLine("Вершина дерева: ");
                root.Print();
                Console.WriteLine();
                Console.ReadLine();
            }
        }
    }
}
Но
1)постоянно выдает ошибку, что неявное приведение типов невозможно
2) не знаю как сравнить num <= n
3) и с вводом значений теперь что-то не так
Заранее большое спасибо
Rei-li вне форума Ответить с цитированием
Старый 16.02.2012, 13:28   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Самое простое решение-добавить делегат Сравнение. Попробуй так:
Код:
using System;

namespace ConsoleApplication2
{
    internal class Program
    {
        #region Delegates

        public delegate bool ComparisonDelegate( object x, object y );

        #endregion

        private static void Main()
        {
            ComparisonDelegate del = DoubleComparison;
            var tr = new Tree< double >( del );
            tr.Input();
            tr.Print();
        }

        private static bool DoubleComparison( object x, object y )
        {
            return ( double ) x <= ( double ) y;
        }

        #region Nested type: Node

        private sealed class Node< T >
        {
            private readonly ComparisonDelegate dComparisonDelegate;
            private readonly T n;
            private Node< T > left;
            private Node< T > right;

            public Node( T num, ComparisonDelegate del )
            {
                n = num;
                left = null;
                right = null;
                dComparisonDelegate = del;
            }

            public void Print()
            {
                Console.WriteLine( n );
                if ( left != null )
                    left.Print();
                if ( right == null )
                    return;
                Console.Write( "         " );
                right.Print();
            }

            public void Add( T num )
            {
                if ( dComparisonDelegate( num, n ) )
                {
                    if ( left == null )
                    {
                        var newNode = new Node< T >( num, dComparisonDelegate );
                        left = newNode;
                    }
                    else
                        left.Add( num );
                }
                else
                {
                    if ( right == null )
                        right = new Node< T >( num, dComparisonDelegate );
                    else
                        right.Add( num );
                }
            }
        }

        #endregion

        #region Nested type: Tree

        private sealed class Tree< T >
        {
            private readonly ComparisonDelegate del;
            private Node< T > root;

            public Tree( ComparisonDelegate comparisonDelegate )
            {
                root = null;
                del = comparisonDelegate;
            }

            public void Input()
            {
                int i;
                Console.WriteLine( "Введите количество вершин дерева" );
                var y = Convert.ToInt32( Console.ReadLine() );
                Console.WriteLine( "Введите значения вершин" );
                for ( i = 0; i < y; i++ )
                {
                    var n = ( T ) Convert.ChangeType( Console.ReadLine(), typeof ( T ) );

                    Add( n );
                }
            }

            private void Add( T n )
            {
                if ( root == null )
                    root = new Node< T >( n, del );
                else
                    root.Add( n );
            }

            public void Print()
            {
                if ( root == null )
                    Console.WriteLine( "Дерево пустое" );

                else
                {
                    Console.WriteLine( "Вершина дерева: " );
                    root.Print();
                    Console.WriteLine();
                    Console.ReadLine();
                }
            }
        }

        #endregion
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
n-мерное дерево из двоичного дерева alexande-rus Общие вопросы C/C++ 0 13.04.2011 22:04
Поиск двоичного дерева mtg Общие вопросы C/C++ 2 01.12.2010 21:15
Обход двоичного дерева слева Дядя Тёма Фриланс 2 22.06.2010 17:02
Обход двоичного дерева слева Дядя Тёма Помощь студентам 0 05.06.2010 18:25
Обход двоичного дерева F1nk Помощь студентам 0 03.06.2010 17:51