бинарные деревья

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: бинарные деревья

michael » 20 ноя 2004, 12:49

spasibo -razorabralsia

versus » 17 ноя 2004, 15:31

michael, ну тебе же уже все дали!
количество узлов посчитать можешь? ( Amount )
log2(от этого количества) посчитать можешь? ( Height )
сравнить количество узлов Amount с 2*Height - 1 можешь?
ну так в чем тогда проблема? в том что CountNodes рекурсивный? Так его легко можно переписать без рекурсии.

michael » 17 ноя 2004, 15:19

ya znaiu 4to 2**k-1 no problema 4to visotu ya doljen pods4itat' v toy je funkzie

versus » 17 ноя 2004, 15:14

> Бинарный граф явл. правильным тогда и только тогда,
> когда кол-во его вершин равно 2**k-1,

ну вот, я же сказал велосипед переизобретаем :)

michael » 17 ноя 2004, 15:14

kod horowiy. No nado v TOY je funkzie vi4isliat' visotu dereva.
Ya v ot4aenie :cry:

chew » 17 ноя 2004, 13:36

Ниже приведён текст программы на C#.
Она подсчитывает кол-во вершин графа.

После получения этого числа надо использовать:
Теорема.
Бинарный граф явл. правильным тогда и только тогда,
когда кол-во его вершин равно 2**k-1,
где k - высота графа.
Док-во: почти очевидно :)

Если получено число 'N' и оно имеет такой вид, то граф правильный.
-------------------------------------------------------------------------------------
using System;

namespace chewProject1
{
public class BTree
{
public BTree v1;
public BTree v2;
public string nameNode;
public BTree(string name)
{
nameNode = name;
}

public static int CountNodes(BTree bTree)
{ // выдаёт кол-во вершин бинарного графа
// NB! рекурсивный метод!
int cnt=1; // текущая вершина

if ( (bTree.v1 != null) )
{// левая ветка
cnt += CountNodes(bTree.v1);
}
if ( (bTree.v2 != null) )
{// правая ветка
cnt += CountNodes(bTree.v2);
}

if ( (bTree.v1 == null) && (bTree.v2 == null) )
{// лист
return (1);
}
return (cnt);
}

public static void Main()
{
// заполняем дерево
BTree c1= new BTree("c1"); // лист
BTree c2= new BTree("c2"); // лист
BTree b1= new BTree("b1");
b1.v1 = c1;
b1.v2 = c2;
BTree d1= new BTree("d1"); // лист
BTree d2= new BTree("d2"); // лист
BTree b2= new BTree("b2");
b2.v1 = d1;
b2.v2 = d2;

BTree a1= new BTree("a1"); // корень
a1.v1 = b1;
a1.v2 = b2;

int n= BTree.CountNodes(a1);
Console.WriteLine("CountNodes: {0}", n);
// если n=2**k -1, то граф полный.
}
}
}
-------------------------------------------------------------------------------------

versus » 17 ноя 2004, 13:06

тогда добавь в in_order еще один параметр - level.

Код: Выделить всё

// вычисляем высоту дерева
int tree_height = eval_tree_height();

int in_order(const Node* t, int level)
{
  int node_sum = 0;
  level++;

  if (t->left != NULL)
    node_sum++;

  if (t->right != NULL)
    node_sum++;

  switch(node_sum)
    {
    case 2: // нормальный узел с двумя потомками
      return max(in_order(t->right, level), in_order(t->left, level));
    case 1: // узел с одним потомком
      return 1;
    case 0: // дошли до узла, проверить равен ли текущий 
               // уровень высоте дерева
      if (level != tree_height)
        return 1;
      else
        return 0;
    default:
      printf("doh!");
    }
}
зовешь in_order так:

Код: Выделить всё

in_order(tree, 0);
и получаем для

Код: Выделить всё

6, 7, 2, 1, 4

aka:
       6 
      / \ 
     2   7 
    / \      
  1    4
1 (неполное)

а для

Код: Выделить всё

5, 7, 6, 9, 2, 1, 3

aka:
      5
    /   \
   2     7
  / \    / \
 1   3 6   9
0 (полное)

michael » 17 ноя 2004, 11:23

da no eto ne polnoe binarnoe derevo. V zadanie skazano 4to vse list'ya doljni bit' na odnoy visote.

(Izvinite 4to piwu ne na ruskom-ya sei4as na drugom komp. gde net podderjki)

versus » 17 ноя 2004, 01:19

к сожалению не могу ничем помочь. Результат работы in_order напрямую зависит от того как заполняется дерево.

пусть бинарным деревом будет дерево двоичного поиска (другой реализации не оказалось под рукой %))... в принципе это такое же бинарное дерево только с парой дополнительный свойств.

вход:
6, 3, 2, 1, 4

дерево:

Код: Выделить всё

       6
      / 
     3    
    / \      
  2    4
 /      
1       
выход: 1


вход:
6, 7, 2, 1, 4

дерево:

Код: Выделить всё

       6
      / \
     2   7
    / \      
  1    4 


выход: 0

Должно быть так. Проверил на своей программе - работает. А у вас? :)

ps: надеюсь никто не видел как я облажался с рисованием дерева? :)

michael » 17 ноя 2004, 00:35

К сожалению результат так и остаётся 0. :(

Вернуться к началу