<?php
Class BTNode
{
public $data ;
public $lChild ;
public $rChild ;
public function __construct ( $data = null )
{
$this - > data = $data ;
}
}
Class BinaryTree
{
public $btData ;
public function __construct ( $data = null )
{
$this - > btData = $data ;
}
public function createBT ( & $root = null )
{
$elem = array_shift ( $this - > btData ) ;
if ( $elem == null ) {
return 0 ;
} else if ( $elem == '#' ) {
$root = null ;
} else {
$root = new BTNode ( ) ;
$root - > data = $elem ;
$this - > createBT ( $root - > lChild ) ;
$this - > createBT ( $root - > rChild ) ;
}
return $root ;
}
function preOrder ( $root )
{
$stack = new SplStack ( ) ;
$stack - > push ( $root ) ;
while ( ! $stack - > isEmpty ( ) ) {
$node = $stack - > pop ( ) ;
echo $node - > data . " " ;
if ( $node - > rChild != null )
$stack - > push ( $node - > rChild ) ;
if ( $node - > lChild != null )
$stack - > push ( $node - > lChild ) ;
}
}
function inOrder ( $root )
{
$stack = new SplStack ( ) ;
$node = $root ;
while ( ! $stack - > isEmpty ( ) || $node != null ) {
while ( $node != null ) {
$stack - > push ( $node ) ;
$node = $node - > lChild ;
}
$node = $stack - > pop ( ) ;
echo $node - > data . " " ;
$node = $node - > rChild ;
}
}
public function tailOrder ( $root )
{
$stack = new SplStack ( ) ;
$out_stack = new SplStack ( ) ;
$stack - > push ( $root ) ;
while ( ! $stack - > isEmpty ( ) ) {
$node = $stack - > pop ( ) ;
$out_stack - > push ( $node ) ;
if ( $node - > lChild != null )
$stack - > push ( $node - > lChild ) ;
if ( $node - > rChild != null )
$stack - > push ( $node - > rChild ) ;
}
while ( ! $out_stack - > isEmpty ( ) ) {
$node = $out_stack - > pop ( ) ;
echo $node - > data . " " ;
}
}
}
function reConstructBinaryTree ( $preOrder , $inOrder )
{
if ( $preOrder && $inOrder ) {
$treeRoot = new BTNode ( $preOrder [ 0 ] ) ;
$index = array_search ( $preOrder [ 0 ] , $inOrder ) ;
$treeRoot - > lChild = reConstructBinaryTree ( array_slice ( $preOrder , 1 , $index ) , array_slice ( $inOrder , 0 , $index ) ) ;
$treeRoot - > rChild = reConstructBinaryTree ( array_slice ( $preOrder , $index + 1 ) , array_slice ( $inOrder , $index + 1 ) ) ;
return $treeRoot ;
}
}
$data = [ 1 , 2 , 4 , '#' , '#' , 5 , '#' , '#' , 3 , '#' , 6 , '#' , '#' ] ;
$tree = new BinaryTree ( $data ) ;
$root = $tree - > createBT ( ) ;
$tree - > preOrder ( $root ) ;
echo PHP_EOL ;
$tree - > inOrder ( $root ) ;
echo PHP_EOL ;
$tree - > tailOrder ( $root ) ;