Бинарное дерево - это иерархическая структура данных, в которой каждый узел имеет значение (оно же является в данном случае и ключом) и ссылки на левого и правого потомка. Узел, находящийся на самом верхнем уровне (не являющийся чьим либо потомком) называется корнем
@Shoakramova_N6 ай бұрын
Отличные уроки! Спасибо большое за не легкий труд и время которое вы нам уделяете! Все доходчиво и понятно)
@super_puper097653 жыл бұрын
Доброго дня! Пару замечаний. 1. На счет CompareTo(). 1.1. Единственное, что нам тут нужно сравнивать - это data и Data. Поэтому определение класса Node выглядит так: class Node where T: IComparable никаких других сравнений нам не нужно. Реализовывать никаких CompareTo() нам тоже не нужно, этим пусть озаботится класс Т. 1.2. В описании интерфейса IComparable не написано, что int CompareTo(T other) должен возвращать +-1. Там написано "больше нуля" и "меньше нуля". Поэтому писать if(node.Data.CompareTo(Data) == -1) - можно нарваться. 2. имхо, было бы логично сделать функции Add() булевыми. Отказываться от добавления, если а) на вход пришел null (в этом случае вылетит Add() на node.Data.CompareTo(Data)) и б) - если такое значение уже есть тогда класс Node будет выглядеть примерно так: class Node where T: IComparable { public T Data { get; private set; } public Node Left { get; private set; } public Node Right { get; private set; } public Node(T data) { Data = data; } public Node(T data, Node left, Node right) { Data = data; Left = left; Right = right; } public bool Add(T data) { if(data == null) { return false; } var compareResult = data.CompareTo(Data); if (compareResult < 0) { if(Left == null) { Left = new Node(data); } else { return Left.Add(data); } } else if(compareResult == 0) { return false; } else { if(Right == null) { Right = new Node(data); } else { return Right.Add(data); } } return true; } public override string ToString() { return Data.ToString(); } } класс Tree: class Tree where T: IComparable (больше ничего не нужно!) и меняется функция Add: public bool Add(T data) { if(data == null) { return false; } if(Root == null) { Root = new Node(data); Count = 1; return true; ; } var addResult = Root.Add(data); if (addResult) { Count++; } return addResult; } остальное остается как есть. P.S. спасибо за стрим, лайк поставил :)
@AlexV-zg6co4 жыл бұрын
Шарп и CodeBlog- топ контент на карантине для работяг!
@denisosipenko74135 жыл бұрын
Спасибо огромное, за твой труд. Интересное видео!
@CODEBLOG5 жыл бұрын
Всегда пожалуйста )
@dad912 Жыл бұрын
Я так понимаю небинарные деревья - это просто заместо двух параметров Left Right использовать List Для каждой нodы нужно ..
@kulivers19982 жыл бұрын
Отличные объяснения, спасибо вам огромное
@ВладиславШумейко-ф3з3 жыл бұрын
Спасибо огромное, а то на первом курсе с дистанционкой сложновато. Отличное понятное объяснение.
@Александр-и3й3д5 жыл бұрын
Спасибо большое за труд твой
@CODEBLOG5 жыл бұрын
Всегда пожалуйста )
@ivanomelchenko18953 жыл бұрын
спасибо за урок!)
@МихаилСироткин-м3н3 жыл бұрын
Спасибо (наконец понял, бинарные деревья)
@xtereone3 жыл бұрын
Спасибо за контент!)
@Vovagv4 жыл бұрын
Большое спасибо тебе за твой труд! Добра тебе чувак! =)
@user-Inquisitorr5 жыл бұрын
Спасибо огромное! Все очень доступно и просто. Реализация на массиве гараздо муторней как я понимаю.
@CODEBLOG5 жыл бұрын
Рад, что понравилось. ну не так, чтобы совсем плохо, просто другой алгоритм используется
@user-Inquisitorr5 жыл бұрын
@@CODEBLOG Подскажите, для удаление элементов надо проходить все проверки как при добавлении?? Или проще убирать элемент и перестраивать заново? Муторно как то совсем выходит
@oleksandraokhotnykova86723 жыл бұрын
Спасибо большое за урок) жалко только,что вторая часть с методом удаления так и не вышла(..
@ВолодимирБарибін-е8у4 жыл бұрын
55:50 не понял на этой минуте. Получается вы создали метод CompareTo(), чтобы сравнивать элементы, которые будут вноситься в структуру. И в этом же методе вызываете стандартный метод CompareTo(), который предлагает C# сообщество, или это рекурсия?
@punisher050502 жыл бұрын
День Добрый, помогите пожалуйста с данным заданием: В заданном бинарном дереве найти первое вхождение заданного элемента и напечатать пройденные при поиске узлы дерева: при прямом и обратном обходе дерева
@ВолодимирБарибін-е8у4 жыл бұрын
Почему не подойдёт перегрузка операторов сравнения для того, чтобы сравнить node и current?
@vladbohdanets29763 жыл бұрын
Здраствуйте. Скажите пожалуйста, как можно заменить значение дублирующихся элементов, на 0 Например есть такие элементы: 1 2 3 3 5 На выходе должно получиться так: 1 2 0 0 5 Написал такой код: public static void ChangeTree(Leaf root) { if (root != null) { ChangeTree(root.Left); if (root.Data == 5) root.Data = 0; ChangeTree(root.Right); } } Но здесь меняеться только если элемент равен, больше или меньше какому то числу
@talisman1104 Жыл бұрын
Берёшь элемент и сравниваешь со следующим, если есть совпадения, то совпадение и элемент заменяются на нуль
@Unknown_Eugene4 жыл бұрын
добрый вечер, Вадим. Спасибо большое за урок, очень помогают Ваши видео! Но меня мучает один вопрос. У меня задание сделать дерево, в котором будут лежать объекты моего класса. Как это реализовать? Что бы дерево принимало не стандартный тип данных, а объект класса? И надо ли в таком случае "обучать" IComparable сравнивать объекты моего класса?
@user-not-user2 жыл бұрын
А возможно ли из дерева удалить элементы?
@СашаГрибков-р2ч4 жыл бұрын
А можете объяснить с деревьями оптимального поиска ?
@proit66233 жыл бұрын
А если на входе Значение равное корню то как его пристраивать в дерево?
@antonpylypenko82334 жыл бұрын
неплохая музыка на фоне)
@maksk50174 жыл бұрын
Я музычку в 2x слушаю, прикольная такая)))
@pazenkin4 жыл бұрын
На скорости просмотра 3х-4х она уже начинает пугать)
@maksk50174 жыл бұрын
@@pazenkin там есть 3 - 4 x?
@RS-nj2dv4 жыл бұрын
@@maksk5017 сверхчеловек, может ускорять видео у себя в голове
@RS-nj2dv4 жыл бұрын
ну либо он может ускорять жизнь, в любом случае это сверх человек.
@ТимурАбдулов5 жыл бұрын
Ну и на паскале до кучи ))) Type TPeremens=class C:Char; ZNA:Ansistring; BOL,RAV,MEN:TPeremens; Constructor Create(ic:Char); Procedure SP(N:Ansistring;Z:Ansistring); Function RP(N:Ansistring):Ansistring; end; Constructor TPeremens.Create(ic:Char); begin C:=ic; end; function del(s:Ansistring):Ansistring; begin Delete(s,1,1);del:=s;end; procedure TPeremens.SP(N:Ansistring;Z:Ansistring); var rez:Ansistring; begin if n='' then zna:=z else if n[1]=c Then begin if rav=nil then rav:=TPeremens.Create(n[1]); RAV.SP(del(n),z) end else if n[1]>c Then begin if bol=nil then bol:=TPeremens.Create(n[1]); bol.SP(n,z) end else if n[1]c Then begin if bolnil then rez:=bol.RP(n) end else if n[1]
@Полюшка-й6ш2 жыл бұрын
А удаление будет?
@win4ester44 Жыл бұрын
666 лайков... прерываю этот дъявольский круг и ставлю 667-ой
@raiver62063 жыл бұрын
дизлайк поставили фанаты js
@ТимурАбдулов5 жыл бұрын
Накарябал тут на похожую тему код не большой ))) class TP { public:char C;char*Z;TP*B;TP*R;TP*M; TP(char iC){ C=iC; R=NULL;M=NULL;B=NULL;} void SP(char*n,char*iZ){ if (n[0]==NULL) Z=iZ;else if (n[0]==C){if (R==NULL) R=new TP(n[0]);R->SP(&n[1],iZ);} else if (n[0] >C){if (B==NULL) B=new TP(n[0]);B->SP(&n[0],iZ);} else if (n[0] SP(&n[0],iZ);};} char* RP(char*n) {char* RE=0;if (n[0]==NULL) RE=Z; else if (n[0]==C){if (R!=NULL) RE=R->RP(&n[1]);} else if (n[0] >C){if (B!=NULL) RE=B->RP(&n[0]);} else if (n[0] RP(&n[0]);}; return RE;}; }; int main() { TP*test=new TP(' '); test->SP((char*)"VAR1",(char*)"1");// VAR1=1; test->SP((char*)"VAR2",(char*)"2");// VAR2=2; test->SP((char*)"VAR3",(char*)"3");// VAR3=3; std::cout
@ТимурАбдулов5 жыл бұрын
RP ( ИМЯ ЗНАЧЕНИЕ) Чтение занчения SP( ИМЯ ЗАНЧЕНИЕ ) Установка Значения
@ТимурАбдулов5 жыл бұрын
Я Специально не использую вские навароты что бы понятнее было так то конечно можно было бы уменьшить раза в 2 код хмм.....