-1

Написать сильно ветвящееся дерево на основе бинарного дерева c двумя типами ссылок.(на узел брата и и на узел потомка), соответствующие структуре музыкальной коллекции, хранящейся на пк.

Есть главный каталог музыки, в нем располагаются подкаталоги и/или файлы с музыкальными композициями , каждый каталог может хранить как подкаталоги так и файлы (вложенность подкаталогов не ограничена)

Каталог задается только своим название, а про файлы с музыкальной композицией дополнительно известна ее длительность (в секундах)

Данные вводятся с клавиатуры: для нового каталога запрашивается его название и название существующего в дереве родительского каталога, для файла доп. запрашивается его длительность

Изначально в дереве существует корневой каталог с названием "Музыка"

Можно считать, что названия всех каталогов коллекции уникальны

Упорядочивать по алфавиту содержимое каталогов не нужно

  • 2
    Чем сильно ветвящееся дерево отличается от несильно ветвящегося? – aepot Jun 13 '21 at 10:01
  • @aepot, скорее всего тем, что в не сильно ветвящемся, ссылки на дочерние узлы непосредственно в полях хранятся, типа left, right - а с сильно ветвящимся - количество дочерних узлов заранее неизвестно :) – Grundy Jun 13 '21 at 10:02
  • 1
    @Grundy то есть список узлов - это бинарное дерево? Тогда в чем смысл такого ветвящегося дерева? – aepot Jun 13 '21 at 10:05
  • @aepot несильно ветвящиеся , я так понимаю это вы имеете ввиду бинарное дерево? Просто в сильно ветвящемся у нода может быть произвольное количество детей – TheDesireToBelieve Jun 13 '21 at 10:12
  • @aepot по сути это тоже Б-дерево, только без балансировки – TheDesireToBelieve Jun 13 '21 at 10:14

1 Answers1

0

Вышло как-то так


using System.Collections.Generic;

namespace ConsoleApp2 { public class SvTreeNode { public readonly string Name; protected SvTreeNode(string nameOfNode) { Name = nameOfNode; } }

public class Track : SvTreeNode
{

    public readonly int DurationInSecond;

    public Track(string name, int durationInSecond) : base(name)
    {
        DurationInSecond = durationInSecond;
    }
}

public class Folder : SvTreeNode
{
    public readonly List<SvTreeNode> ListOfFileInFolder = new List<SvTreeNode>();
    public Folder(string name) : base(name){}
}


}

////

using System;
using System.Threading;

namespace ConsoleApp2 { public class SvTree { private readonly Folder _root;

    private int _count; 

    public SvTree(string nameOfRoot)
    {
        _root = new Folder(nameOfRoot);
        _count++;
    }

    private SvTreeNode Search(string name)
    {
        return SearchTo(name, _root);
    }
    private SvTreeNode SearchTo(string name, Folder folder)
    {
        if (name == _root.Name) return _root;

        foreach (var file in folder.ListOfFileInFolder)
        {
            if (file.Name == name) return file;

            if (file is Folder tempFile) 
                SearchTo(name, tempFile);
        }

        return null;
    }



    private static void InsertTo(Folder folder, SvTreeNode node)
    {
        folder.ListOfFileInFolder.Add(node);
    }
    public void InsertFolder(string nameOfNewFolder, string nameOfFolder)
    {
        var insertValue = new Folder(nameOfNewFolder);
        _count++;

        if (Search(nameOfFolder) is Folder currentFolder) 
            InsertTo(currentFolder, insertValue);
    }
    public void InsertMusicFile(string nameOfMusicFile, int durationInSec, string nameOfFolder)
    {
        var insertValue = new Track(nameOfMusicFile, durationInSec);
        _count++;

        if (Search(nameOfFolder) is Folder currentFolder) 
            InsertTo(currentFolder, insertValue);
    }


}

}

///

using System;

namespace ConsoleApp2 { static class Program { private static void Main() { const string nameOfRootFolder = "Музыка";

        var music = new SvTree(nameOfRootFolder);

        //Альбом Convolk "AntiHero"
        music.InsertFolder("ANTIHERO", nameOfRootFolder);
        music.InsertMusicFile("convolk - swear to god",129, "ANTIHERO");
        music.InsertMusicFile("convolk - black sheap",164, "ANTIHERO");
        music.InsertMusicFile("convolk - medicine",156, "ANTIHERO");

        //Альбом Незабудки "1999"
        music.InsertFolder("1999", nameOfRootFolder);
        music.InsertMusicFile("НЕЗАБУДКИ - Бегство",177, "1999");
        music.InsertMusicFile("convolk - Балкон",183, "1999");
        music.InsertMusicFile("convolk - Лето",160, "1999");

        Console.WriteLine();



    }
}

}