Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 17.06.2015
Сообщений: 2
1

Как разобраться с деревьями в C#

17.06.2015, 20:34. Просмотров 1334. Ответов 5
Метки нет (Все метки)

Начал изучать C#, знания нулевые.
Нужно создать дерево и определить, сколько вершин дерева, имеют только одного потомка.

Мне помогали товарищи ро учебе, но у них такие же знания как у меня.
Вот что мы сделали, прошу указать на ошибки:



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Drevo drev = new Drevo(1);
            drev.Left = new Drevo(2);
            drev.Left.Left = new Drevo(2.1);
            drev.Left.Right = new Drevo(2.2);
            drev.Right = new Drevo(3);
            drev.Right.Left = new Drevo(3.1);
            drev.Right.Right = new Drevo(3.2);
            drev.Right.Right.Right = new Drevo(4);
            drev.Left.Left.Left = new Drevo(5);
            Console.WriteLine(@"
          {0}    
      {1}       {2}  
   {3}  {4}  {5}  {6}
{7}                  {8}", drev.Data, drev.Left.Data, drev.Right.Data, drev.Left.Left.Data, drev.Left.Right.Data, drev.Right.Left.Data, drev.Right.Right.Data, drev.Right.Right.Right.Data, drev.Left.Left.Left.Data);
 
            Console.WriteLine(drev.Count());
            Console.ReadKey();
        }
    class Drevo
    {
        
         public double Data { get; set; }
            public Drevo Left { get; set; }
            public Drevo Right { get; set; }
        }
 
        public void Drevo(double data)
        {
            this.Data = data;
        }
        public int Count()
        {
            
            if ((Left != null && Right == null) || (Left == null && Right != null))  
            {
                int result = Left.Count() + Right.Count();
                return result;
            }
          return 0;
        }
    }       
   }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2015, 20:34
Ответы с готовыми решениями:

Подскажите,как правильно работать с деревьями
Есть такое задание: Реализовать создание красно-черного дерева Разработать процедуры добавления...

Как подписать комментарии и разобраться с работой кода? Дали задание разобраться и объяснить, а я совсем новичок
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива...

Работа с деревьями
Здравствуйте! Можете подсказать класс, с помощью которого можно работать с деревьями?

5
5 / 5 / 2
Регистрация: 25.10.2014
Сообщений: 29
17.06.2015, 22:40 2
1)Что должно делать твое дерево?
2)Тебе нужно бинарное дерево?
3)Если не бинарное дерево, то по какому принципу должны добавляться элементы в дерево?
0
Эксперт .NETАвтор FAQ
9603 / 4728 / 1696
Регистрация: 11.01.2015
Сообщений: 5,898
Записей в блоге: 34
17.06.2015, 23:43 3
Цитата Сообщение от r2d24 Посмотреть сообщение
Нужно создать дерево и определить, сколько вершин дерева, имеют только одного потомка.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication196
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var root = new TreeNode<int> { Value = 11 };
            root.Add(12).Add(13);
            root.Add(14);
            root.Add(15).Add(16);
 
            var count = root.ThisAndAllChilds.Where(n=>n.Count == 1).Count();
 
            Console.WriteLine("Count: " + count);
 
            Console.ReadLine();
        }
    }
 
    public class TreeNode<T> : List<TreeNode<T>>
    {
        public T Value { get; set; }
 
        public TreeNode<T> Add(T value)
        {
            var node = new TreeNode<T> { Value = value };
            Add(node);
            return node;
        }
 
        public IEnumerable<TreeNode<T>> ThisAndAllChilds
        {
            get
            {
                yield return this;
 
                foreach (var child in this)
                foreach (var c in child.ThisAndAllChilds)
                    yield return c;
            }
        }
    }
}
1
MrCold
18.06.2015, 00:18
  #4

Не по теме:


и ещё удивила запись

Цитата Сообщение от Storm23 Посмотреть сообщение
public class TreeNode<T> : List<TreeNode<T>>

0
0 / 0 / 0
Регистрация: 17.06.2015
Сообщений: 2
18.06.2015, 10:28  [ТС] 5
За задачу спасибо, только мне не понятно, почему, если задать дерево
C#
1
2
3
4
5
6
7
root.Add(12).Add(13);
            root.Add(12).Add(13).Add(19);
            root.Add(12).Add(13).Add(20);
            root.Add(14);
            root.Add(15).Add(16);
            root.Add(15).Add(16).Add(17);
            root.Add(15).Add(16).Add(18);
То количество, выдает 10. Насколько я понял, должно быть 6 ?
0
Эксперт .NETАвтор FAQ
9603 / 4728 / 1696
Регистрация: 11.01.2015
Сообщений: 5,898
Записей в блоге: 34
18.06.2015, 12:17 6
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

r2d24, вы неправильно создаете дерево. Каждый(!) вызов Add создает новую вершину (даже если вы передаете то же самое число).
То дерево, которое вы пытаетесь создать должно выглядеть так:
C#
1
2
3
4
5
6
7
8
9
var node12 = root.Add(12);
var node13 = node12.Add(13);
node13.Add(19);
node13.Add(20);
root.Add(14);
var node15 = root.Add(15);
var node16 = node15.Add(16);
node16.Add(17);
node16.Add(18);
Добавлено через 11 минут
Добавил вывод дерева в консоль, что бы легче было ориентироваться:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication196
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var root = new TreeNode<int> { Value = 11 };
            var node12 = root.Add(12);
            var node13 = node12.Add(13);
            node13.Add(19);
            node13.Add(20);
            root.Add(14);
            var node15 = root.Add(15);
            var node16 = node15.Add(16);
            node16.Add(17);
            node16.Add(18);
 
            Console.WriteLine("Tree:");
            Console.WriteLine(root.GetAsString());
 
            var count = root.ThisAndAllChilds.Where(n => n.Count == 1).Count();
 
            Console.WriteLine();
            Console.WriteLine("Count: " + count);
 
            Console.ReadLine();
        }
    }
 
    public class TreeNode<T> : List<TreeNode<T>>
    {
        public T Value { get; set; }
 
        public TreeNode<T> Add(T value)
        {
            var node = new TreeNode<T> { Value = value };
            Add(node);
            return node;
        }
 
        public IEnumerable<TreeNode<T>> ThisAndAllChilds
        {
            get
            {
                yield return this;
 
                foreach (var child in this)
                    foreach (var c in child.ThisAndAllChilds)
                        yield return c;
            }
        }
 
        public string GetAsString(int intend = 0)
        {
            var sb = new StringBuilder();
            sb.AppendLine(new string(' ', intend) + Value);
            foreach (var child in this)
                sb.Append(child.GetAsString(intend + 2));
 
            return sb.ToString();
        }
    }
}
В данном примере одного потомка имеют только вершины 12 и 15. Соответственно программа выдает 2.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2015, 12:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа с деревьями
RECORD * tree(int k) { RECORD *newnode; int nl,nr;//левое и правое поддерево if(k&lt;=0)...

Работа с деревьями
Здравствуйте, помогите пожалуйста. 1. Описать функцию которая: a) печатает узлы непустого дерева...

Помогите с деревьями
Уважаемые Программисты И Знатоки языка Turbo Pascal! Прошу вас помочь мне в нелегком деле! у мну...

Работа с нагруженными деревьями
здравствуйте,собственно возникла ошибка в функции заполнения нагруженного дерева Суть задачи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.