2015-01-30 3 views
0

У меня возникли проблемы с реализацией функции __toString() для печати двоичного дерева, которое я искал в Интернете, но я ничего не смог найти. Буду признателен, если кто-нибудь сможет мне помочь!двоичное дерево поиска в php

Вот код:

class Noeud { 
    public $element; 
    public $fd; 
    public $fg; 

    public function __construct($element){ 
     $this -> element = $element; 
     $this-> fd = NULL; 
     $this-> fg = NULL; 
    } 
} 


class Arbre { 
    private $racine; 

    public function __construct(){ 
     $this->racine = NULL; 
    } 
    public function isEmpty() { 
     return $this->racine === null; 
    } 

    //public function remove($element); 

    public function add($element){ 
     $noeud = new Noeud($element); 

     if($this->isEmpty()){ 
      $this->racine = $noeud; 
     } 
     else{ 
      $this->addNode($noeud,$this->racine); 
     } 
    } 

    public function addNode($noeud, &$new){ 
     if($new === null){ 
      $new = $noeud; 
     } 
     else{ 
      if($node->element > $new->element){ 
       $this->addNode($node,$new->fd); 
      } 
      else if($node->element < $new->element){ 
       $this->addNode($node,$new->fg); 
      } 
      else{ 
       return; 
      } 
     } 
    } 

    public function __toString(){ 
      // 
    } 
+0

Поиск алгоритмов пересечения BST псевдокода и преобразование его в PHP-код, в основном это два типа: сначала поиск по глубине, который исследует ветвь до конца, а затем возвращается к другим ветвям, и поиск по ширине сначала исследует уровень дерева по уровню –

+0

@MikeBasha, который обходит вас по порядку, заказ, предварительный заказ ..? –

ответ

1

ли именно то, что вы делаете для AddNode() метод с точки зрения перемещения по дереву рекурсивно и на каждом узле вы проходите через просто распечатать содержимое. Поэтому на каждом узле вы будете печатать содержимое, а затем распечатывать содержимое любых дочерних узлов. Я не PHP программист, но что-то вроде этого:

printNode() 
{ 
    // print contents of current node 
    if left child exists 
     left child->printNode() 
    if right child exists 
     right child->printNode() 
} 
0

Попробуйте упорядоченную обхода:

class Arbre { 
    // 
    // The existing code 
    // 

    public function __toString() 
    { 
     $this->printSubTree($this->racine, 0); 
    } 

    protected function printSubTree(Noeud $node, $depth) 
    { 
     if ($node === NULL) { 
      return; 
     } 

     // Print the right subtree 
     $this->printSubTree($node->fd, $depth + 1); 
     // Print some spaces for alignment 
     echo(str_pad('', $level, ' ')); 
     // Print the value in $node 
     echo($node->element); 
     // That's all for this line 
     echo("\n"); 
     // Print the left subtree 
     $this->printSubTree($node->fg, $depth + 1); 
    } 
} 

Он работает хорошо на консольных скриптов или, в HTML, если поместить вывод внутри a <PRE> блок. Он печатает дерево, повернутое на 90 градусов против часовой стрелки. Каждый узел остается на своей собственной линии, корень начинается с столбца 1, и каждый узел, находящийся на расстоянии N от корня, имеет значение, напечатанное, начиная с столбца N+1. Вы можете отрегулировать интервал, изменив + 1 с большим значением в звонках до printSubTree().

Смежные вопросы