Это код, который я использовал для реализации двоичного дерева и его операций:
<?php
класс Node
{
общедоступные данные;
public $ leftChild;
public $ rightChild;
публичная функция __construct ($ data)
{
$ This-> данные = $ данных;
$ This-> LeftChild = NULL;
$ This-> RightChild = NULL;
}
публичная функция disp_data ()
{
echo $ this-> data;
}
} // Конечный класс Node
класс BinaryTree
{
public $ root;
// public $ s;
публичная функция __construct ()
{
$ This-> корень = NULL;
// $ this-> s = file_get_contents ( 'магазин');
}
// функция для отображения дерева
отображение публичных функций ()
{
$ This-> display_tree ($ this-> корень);
}
публичная функция display_tree ($ local_root)
{
если ($ local_root == NULL)
вернуть;
$ This-> display_tree ($ local_root-> LeftChild);
echo $ local_root-> data. "
";
$ This-> display_tree ($ local_root-> RightChild);
}
// функция для вставки нового узла
вставка публичной функции ($ key)
{
$ newnode = new Node ($ key);
если ($ this-> корень == NULL)
{
$ This-> корень = $ newnode;
вернуть;
}
еще
{
$ Родитель = $ this-> корень;
$ Тока = $ this-> корень;
в то время как (истина)
{
$ Родитель = $ тока;
// $ this-> find_order ($ ключ, $ current-> данные);
если (ключ == $ ($ this-> find_order ($ ключ, $ current-> данные)))
{
$ Ток = $ current-> LeftChild;
если ($ тока == NULL)
{
$ Родительский,> LeftChild = $ newnode;
вернуть;
} // end if2
} // конец if1
еще
{
$ Ток = $ current-> RightChild;
если ($ тока == NULL)
{
$ Родительский,> RightChild = $ newnode;
возвращение;
} // end if1
} // конец еще
} // конец цикла
} // end else
} // функция окончания вставки
// функция для поиска определенного узла
публичная функция find ($ key)
{
$ Тока = $ this-> корень;
в то время как ($ current-> данные! = $ ключ)
{
если ($ ключ == $ this-> find_order ($ ключ, $ current-> данные))
{
$ Ток = $ current-> LeftChild;
}
еще
{
$ Ток = $ current-> RightChild;
}
если ($ тока == NULL)
вернуться (нуль); * * 1022
}
return($current->data);
} // завершаем функцию для поиска
публичная функция delete1 ($ key)
{
$ Тока = $ this-> корень;
$ Родитель = $ this-> корень;
$isLeftChild=true;
while($current->data!=$key)
{
$parent=$current;
if($key==($this->find_order($key,$current->data)))
{
$current=$current->leftChild;
$isLeftChild=true;
}
else
{
$current=$current->rightChild;
$isLeftChild=false;
}
if($current==null)
return(null);
}//end while loop
echo "<br/><br/>Node to delete:".$current->data;
//to delete a leaf node
if($current->leftChild==null&&$current->rightChild==null)
{
if($current==$this->root)
$this->root=null;
else if($isLeftChild==true)
{
$parent->leftChild=null;
}
else
{
$parent->rightChild=null;
}
return($current);
}//end if1
//to delete a node having a leftChild
иначе, если ($ current-> rightChild == null)
{
если ($ == ток $ this-> корень)
$ This-> корень = $ current-> LeftChild;
иначе если ($ isLeftChild == true)
{
$ Родительский,> LeftChild = $ current-> LeftChild;
}
еще
{
$ Родительский,> RightChild = $ current-> LeftChild;
}
возврата ($ тока);
} // end else if1
// удалить узел, имеющий rightChild
иначе если ($ current-> leftChild == null)
{
если ($ тока == $ this-> корень)
$ This-> корень = $ current-> RightChild;
иначе если ($ isLeftChild == true)
{
$ Родительский,> LeftChild = $ current-> RightChild;
}
еще
{
$ Родительский,> RightChild = $ current-> RightChild;
*} 1030 *
возврата ($ тока);
}
// удалить узел, имеющий обоих потомков
еще
{
$ Правопреемник = $ этом-> get_successor ($ тока);
если ($ тока == $ this-> корень)
{
$ This-> корень = $ правопреемник;
}
else if($isLeftChild==true)
{
$parent->leftChild=$successor;
}
else
{
$parent->rightChild=$successor;
}
$successor->leftChild=$current->leftChild;
return($current);
}
} // завершаем функцию удаления узла
// Функция для поиска узла-преемника
публичная функция get_successor ($ delNode)
{
$ SuccParent = $ delNode;
$ Преемник = $ delNode;
$ Темп = $ delNode-> RightChild;
в то время как ($ темп! = NULL)
{$ SuccParent = $ правопреемник;$ Правопреемника = $ темп;$ Темп = $ TEMP-> LeftChild;} if ($ successor! = $ delNode-> rightChild) {$ succParent-> leftChild = $ successor-> rightChild;$ Successor-> RightChild = $ delNode-> RightChild;} return ($ successor);} // функция для поиска порядка двух строк public function find_order ($ str1, $ str2) {$ str1 = strtolower ($ str1);$ Str2 = strtolower ($ str2);$ I = 0;$ j = 0;
$p1=$str1[i];
$p2=$str2[j];
while (true) {
if (ord ($ p1)
return($str1);
}
else
{
if(ord($p1)==ord($p2))
{
$p1=$str1[++$i];
$p2=$str2[++$j];
continue;
}
return($str2);
}
} // конец при
} // конецфункция найти порядок строк
публичная функция is_empty () {if ($ this-> root == null) return (true); else return (false);}} // конец класса BinaryTree?>