|
|
|
| Кто нибудь смог составить такую структуру данных на php? Поделитесь. (без использования баз данных). Я вроде бы как смог составить, но чую не во всех случаях дерево работает правильно..
+Вопрос
Можно ли в php создать класс в классе?
class tobe{
class not_tobe{
}
}
|
| |
|
|
|
|
|
|
|
для: Tonik992
(28.05.2010 в 02:55)
| | нет нельзя | |
|
|
|
|
|
|
|
|
для: Tonik992
(28.05.2010 в 02:55)
| | Покажите свою структуру. И расскажите какие действия вы производтие над деревом.
> Можно ли в php создать класс в классе?
Нельзя | |
|
|
|
|
|
|
|
для: Саня
(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... Но это не правильно, ни к чему, из-за этого необходимость создать класс в классе | |
|
|
|
|
|
|
|
для: Tonik992
(28.05.2010 в 13:17)
| | Какое-то странное у вас понимание инкапсуляции.
> Ведь, я по сути могу создать в программе в любой момент времени объект класса node
> Но это не правильно
Так Tree тоже можно везде создать. Например в шаблоне страницы (или в любом другом месте, где Tree не нужен). Как с этим бороться собираетесь?
> ($elem,&$node)
Объекты всегда передаются по ссылке. Не пишите лишнего. | |
|
|
|
|
|
|
|
для: Саня
(28.05.2010 в 16:01)
| | Объект класса Tree создавать - верный способ.. Но создание объекта класса node в любом месте - не есть тру, нужно лишь допустить создание экземпляра node в классе Tree..
////
add($elem,$node) - без ссылки не работает ничего.. | |
|
|
|
|
|
|
|
для: 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']);
}
}
// и так далее
| ООП тут совсем лишний.
Ваш код является типичным случаем ООП ради ООП. | |
|
|
|
|
|
|
|
для: Саня
(28.05.2010 в 17:03)
| | Без ООП не обойтись.. Данные не инкапсулируются, получаются не связанные элементы, мтеоды, доступ к дереву публичный... Это неверно с моей стороны.. А так, спасибо, попробую класс node заменить внутренним массивом.. | |
|
|
|