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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2016, 10:31   #1
Neostat
Пользователь
 
Регистрация: 19.10.2014
Сообщений: 49
По умолчанию Вывод B-дерева в контрол TreeView

Уважаемые форумчане, мне очень нужна ваша помощь, помогите пожалуйста организовать вывод B-tree в TreeView.Честно слово уже недели две сижу и не могу догнать как это сделать. Ниже прилагаю свои классы и надеюсь только на вас.

P.s. у меня получилось сделать обход и просто выводить подряд, но как вывести в TreeView чтобы это было похоже на дерево, то есть звенья раскрывались и вываливались их дети. И да программ очень и очень сырая есть ляпы, я не прошу их исправлять, просто помогите пожалуйста сделать вывод в TreeView. Вопрос жизни и смерти...

class BtreeNode
Код:
class BtreeNode
    {
        public bool leaf; 
        public int n;
        int t;
        public int[] keys;
        public BtreeNode[] C;
 
        public BtreeNode(int _t, bool _leaf)
        {
            this.t = _t;
            this.leaf = _leaf;
            keys = new int[2 * t - 1];
            C = new BtreeNode[2 * t];
            n = 0;
        }
 
        public void insertNonFull(int k)
        {
            int i = n - 1;
 
            if (leaf == true)
            {
 
                while (i >= 0 && keys[i] > k)
                {
                    keys[i + 1] = keys[i];
                    i--;
                }
 
                keys[i + 1] = k;
                n = n + 1;
            }
            else
            {
                while (i >= 0 && keys[i] > k)
                    i--;
                if (C[i + 1].n == 2 * t - 1)
                {
                    splitChild(i + 1, C[i + 1]);
 
                    if (keys[i + 1] < k)
                        i++;
                }
                C[i + 1].insertNonFull(k);
            }
        }
 
 
 
 
 
        public void splitChild(int i, BtreeNode y)
        {
 
            BtreeNode z = new BtreeNode(y.t, y.leaf);
            z.n = t - 1;
 
            for (int j = 0; j < t - 1; j++)
                z.keys[j] = y.keys[j + t];
 
            if (y.leaf == false)
                for (int j = 0; j < t; j++)
                {
                    z.C[j] = y.C[j + t];
                    y.C[j + t] = null;
                }
 
 
            for (int j = n; j >= i; j--)
                C[j + 1] = C[j];
 
            C[i + 1] = z;
 
  
            for (int j = n - 1; j >= i; j--)
                keys[j + 1] = keys[j];
 
      
            keys[i] = y.keys[t - 1];
 
     
            for (int j = y.n - 1; j >= t - 1; j--)
                y.keys[j] = 0;
            y.n = t - 1;
 
            n = n + 1;
        }
        public BtreeNode search(int k)
        {
            int i = 0;
            while (i < n && k > keys[i])
                i++;
 
 
            if (keys[i] == k)
                return this;
 
 
            if (leaf == true)
                return null;
 
            return C[i].search(k);
        }
//Вот тут обход дерева и вывод подряд
        public void traverse(TreeView tv)
        {
            int i;
            for (i = 0; i < n; i++)
            {
                if (leaf == false)
                {
                    C[i].traverse(tv);
                }
 
                tv.Nodes.Add(keys[i].ToString());
            }
 
            if (leaf == false)
                C[i].traverse(tv);
        }
 
    }
class Btree
Код:
class BTree
    {
        int t;
        BtreeNode root; 
 
        /// <summary>
        /// конструктор(Инициализация дерева)
        /// </summary>
        /// <param name="_t"></param>
        public BTree(int _t)
        {
            root = null;
            t = _t;
        }
        /// <summary>
        /// Главная функция вставки нового ключи в B-tree
        /// </summary>
        /// <param name="k"></param>
        public void insert(int k)
        {
            if (root == null)
            {
                root = new BtreeNode(t, true);
                root.keys[0] = k; 
                root.n = 1;
            }
            else
            {
                if (root.n == 2 * t - 1)
                {
 
                    BtreeNode s = new BtreeNode(t, false);
 
 
                    s.C[0] = root;
 
                    s.splitChild(0, root);
 
                    int i = 0;
                    if (s.keys[0] < k)
                        i++;
 
                    s.C[i].insertNonFull(k);
 
                    root = s;
                }
                else
                    root.insertNonFull(k);
            }
        }
 
        public BtreeNode search(int k)
        {
            return (root == null) ? null : root.search(k);
        }
 
        public void traverse(TreeView tv)
        {
            if (root != null)
               root.traverse(tv);
        }
 
    }
class BTreeGUI
Код:
class BTreeGUI
    {
        bool change;
        BTree btree;
        TreeView tv;
 
        public bool Change
        {
            get { return change; }
            set
            {
                
                if (value == true)
                {
                    tv.Nodes.Clear();
                    change = value;
                    btree.traverse(tv);
                }
            }
        }
 
        public BTreeGUI(TreeView tv)
        {
            btree = new BTree(2);
            this.tv = tv;
        }
 
        public void Add(int k)
        {
            
            btree.insert(k);
            Change = true;
        }
 
 
    }
Neostat вне форума Ответить с цитированием
Старый 15.04.2016, 12:53   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Используйте WPF контрол.

Для него нужен шаблон, в котором вы устанавливаете текущий узел (текст, например) и ссылку на дочерние непосредственно через ваш класс. Затем биндите список типа ваш класс и по шаблону вам строится дерево, примерно так:
Код:
<TreeView ItemsSource="{Binding Folders}" Margin="10" Height="200">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Folders}" DataType="{x:Type local:IFolder}">
                    <TreeViewItem Header="{Binding FolderLabel}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
Akeloya вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проставить галочки из второго дерева в первое treeview dima1257 C# (си шарп) 8 14.05.2014 01:41
вывод бинарного дерева Sv. Общие вопросы C/C++ 0 19.05.2013 11:55
двигаю контрол мышкой, почему мышка перемещается быстрее чем контрол PaulRom Microsoft Office Access 0 06.12.2011 11:19
TreeView, ImageList и БД(трабл з заполнением дерева) atihiy2010 БД в Delphi 11 07.04.2011 15:52
Сортировка узлов дерева treeview gool Общие вопросы Delphi 1 06.11.2009 09:20