Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Бинарное дерево
 
 автор: Tonik992   (28.05.2010 в 02:55)   письмо автору
 
 

Кто нибудь смог составить такую структуру данных на php? Поделитесь. (без использования баз данных). Я вроде бы как смог составить, но чую не во всех случаях дерево работает правильно..
+Вопрос
Можно ли в php создать класс в классе?
class tobe{
   class not_tobe{
  }
}

  Ответить  
 
 автор: Ури Геллер   (28.05.2010 в 12:03)   письмо автору
 
   для: Tonik992   (28.05.2010 в 02:55)
 

нет нельзя

  Ответить  
 
 автор: Ури Геллер   (28.05.2010 в 12:04)   письмо автору
 
   для: Ури Геллер   (28.05.2010 в 12:03)
 

http://mishustin.net.ru/tutorial/bst.html

  Ответить  
 
 автор: Саня   (28.05.2010 в 12:04)   письмо автору
 
   для: Tonik992   (28.05.2010 в 02:55)
 

Покажите свою структуру. И расскажите какие действия вы производтие над деревом.

> Можно ли в php создать класс в классе?
Нельзя

  Ответить  
 
 автор: Tonik992   (28.05.2010 в 13:17)   письмо автору
 
   для: Саня   (28.05.2010 в 12:04)
 

Tree.class.php

<?php
abstract class ITree {
    
//Корневой узел
    
private $root;
    
//Конструктор дерева, создаем пустой корневой узел
    
abstract public function __construct();
    
//Вспомогательная функция добавления поддеревьев
    
abstract public function add($elem);
    
//Вспомогательная функция вычисления высоты
    
abstract public function height();
    
//Добавление поддерева
    
abstract protected function _add($elem,&$node);
    
//Вычисление высоты
    
abstract protected function _height(&$node);
}

final class 
node {     //Класс для узлов дерева
    //Левое поддерево
    
public $left;
    
//Правое поддерево
    
public $right;
    
//Содержимое
    
public $item;
    
//Конструктор узла
    
public function __construct($item,$left=null,$right=null) {
        
$this->item=$item;
        
$this->left=$left;
        
$this->right=$right;
    }
}

final class 
Tree extends ITree {     //Класс дерева
    
private $root;

    public function 
__construct() { $root NULL; }

    public function 
add($elem) {
        if(!
is_int($elem))die("Elements of tree must be integer");
        
self::_add($elem,$this->root);
    }

    public function 
height() { return self::_height($this->root); }

    protected function 
_add($elem,&$node) {
        if(
$node==NULL) {                //Если в узле нет элементов, то создаем новое поддерево
            
$node = new node($elem);
        }elseif(
$elem<$node->item) {     //Добавляем в левое поддерево
            
self::_add($elem,$node->left);
        }elseif(
$elem>$node->item) {     //Добавляем в правое поддерево
            
self::_add($elem,$node->right);
        }
    }

    protected function 
_height(&$node) {
        if(
$node==null)return 0;
        
$max 0;
        for(
$current=$node->left;$current!=null;$current=$current->right) {
            
$curHeight self::_height($current);
            if(
$curHeight>$max) {
                
$max=$curHeight;
            }
        }
        return 
$max+1;
    }
    public function 
echoTree() { print_r($this->root); }
}
?>

Index.php

<?php
include 'Tree.class.php';
$tree1 = new Tree();

$tree1->add(12);
$tree1->add(5);
$tree1->add(3);
$tree1->add(10);
$tree1->add(7);
$tree1->add(50);
$tree1->add(11);
$tree1->add(6);
$tree1->add(9);
$tree1->add(13);
$tree1->echoTree();
echo 
$tree1->height();
?>


Для более правильной работы программы, не нарушая инкапсуляцию, необходимо класс node реализовать в классе Tree... Т.к. это нельзя, приходится создать его как это в примере сделано
Ведь, я по сути могу создать в программе в любой момент времени объект класса node... Но это не правильно, ни к чему, из-за этого необходимость создать класс в классе

  Ответить  
 
 автор: Саня   (28.05.2010 в 16:01)   письмо автору
 
   для: Tonik992   (28.05.2010 в 13:17)
 

Какое-то странное у вас понимание инкапсуляции.

> Ведь, я по сути могу создать в программе в любой момент времени объект класса node
> Но это не правильно
Так Tree тоже можно везде создать. Например в шаблоне страницы (или в любом другом месте, где Tree не нужен). Как с этим бороться собираетесь?

> ($elem,&$node)
Объекты всегда передаются по ссылке. Не пишите лишнего.

  Ответить  
 
 автор: Tonik992   (28.05.2010 в 16:53)   письмо автору
 
   для: Саня   (28.05.2010 в 16:01)
 

Объект класса Tree создавать - верный способ.. Но создание объекта класса node в любом месте - не есть тру, нужно лишь допустить создание экземпляра node в классе Tree..

////

add($elem,$node) - без ссылки не работает ничего..

  Ответить  
 
 автор: Саня   (28.05.2010 в 17:03)   письмо автору
 
   для: Tonik992   (28.05.2010 в 16:53)
 

Тогда неясно зачем вообще делать node, раз он нигде больше не фигурирует. Да ещё и финальным объявлять.
Можно даже обычным массивом обойтись:
<?
$node 
= array(
  
'left' => null,
  
'right' => null,
  
'item' => null
);

// ...

function add($elem$node) {
  if(
$node==NULL) {                //Если в узле нет элементов, то создаем новое поддерево 
    
$node = array(
      
'left' => null,
      
'right' => null,
      
'item' => $elem
    
); 
  }elseif(
$elem<$node['item']) {     //Добавляем в левое поддерево 
    
self::_add($elem,$node['left']); 
  }elseif(
$elem>$node['item']) {     //Добавляем в правое поддерево 
    
self::_add($elem,$node['right']); 
  }
}
// и так далее
ООП тут совсем лишний.
Ваш код является типичным случаем ООП ради ООП.

  Ответить  
 
 автор: Tonik992   (28.05.2010 в 21:45)   письмо автору
 
   для: Саня   (28.05.2010 в 17:03)
 

Без ООП не обойтись.. Данные не инкапсулируются, получаются не связанные элементы, мтеоды, доступ к дереву публичный... Это неверно с моей стороны.. А так, спасибо, попробую класс node заменить внутренним массивом..

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования