Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Добавление элемента в сбалансированное бинарное дерево.   Найти похожие ветки 

 
Равшан   (2007-04-30 16:33) [0]

Как добавить с помощью функции Add(int) элемент в дерево, чтобы оно было сбалансированным? Сначала делал с помощью флажка f - поочередно налево, потом направо добавлялось. Но потом понял что при кол-ве элементов большим 7 неправильно работает.


class Element {
public:
int data;
Element* left;
Element* right;
Element();
Element(int);
};

void Tree::Add(int a) {
  if(root == NULL) {
   root = new Element(a);
      return;
  }
  AddElement(root, a);
}
void Tree::AddElement(Element* p, int a) {
if (p->left == NULL) {
 p->left = new Element(a);
 return;
}
if (p->right == NULL) {
 p->right = new Element(a);
 return;
}
if (f) {
 f=0;
 AddElement(p->right, a);
} else {
 f=1;
 AddElement(p->left, a);
}
}


 
MBo ©   (2007-04-30 17:03) [1]

Непонятно, есть ли у тебя отношение порядка (ключ больше-меньше)
Для упорядоченных деревьев стоит использовать структуры данных, в которых поддерживается баланс - это, например, черно-красные (RB-tree) и AVL-деревья. http://algolist.manual.ru/


 
MBo ©   (2007-04-30 17:06) [2]

P.S. Если большая часть элементов известна заранее, и динамическое добавление  не сыграет большой роли, можно использовать алгоритм из Вирта для создания сбалансированного дерева из (упорядоченного) массива
http://delphimaster.net/view/2-1176964506/


 
Равшан   (2007-04-30 19:44) [3]

Спасибо. Разобрался.


 
Равшан   (2007-04-30 19:46) [4]

А как вывести дерево на экран в виде дерева?


 
MBo ©   (2007-04-30 19:54) [5]

В горизонтальном виде - рекурсивным обходом в порядке preorder получится
H
-L
--LL
--LR
-R
--RL
--RR
если привычное представление требуется - придется посчитать листья для правильного масщтабирования-выравнивания


 
ferr ©   (2007-04-30 19:56) [6]

> P.S. Если большая часть элементов известна заранее, и динамическое
> добавление  не сыграет большой роли, можно использовать
> алгоритм из Вирта для создания сбалансированного дерева
> из (упорядоченного) массива

Никогда б не подумал что об этом ещё и где-то написано. Казалось что вещь само-собой разумеющаяся.

Автору скорее совет на алголист не ходить а поискать эти темы в талмудах или книжёнках. Я б например посоветовал книгу "Готовые алгоритмы в Delphi" с теннисными мячиками на абложке, там дан неплохой готовый код для AVL, или если есть время то можно разобраться с теорией, например с RB, в Кормене...



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
1-1175374006
Gero
2007-04-01 00:46
2007.05.27
Как свернуть DMClient в трей


15-1177742676
syte_ser78
2007-04-28 10:44
2007.05.27
подскажите насчет видеокарт


15-1177870163
palva
2007-04-29 22:09
2007.05.27
Михаил Веллер


2-1178548742
Regent
2007-05-07 18:39
2007.05.27
Диалог


4-1166490545
Viper_Omsk
2006-12-19 04:09
2007.05.27
Можно ли скрыть процесс?