<?php
//链式二叉树
class node
{
public $data;
public $left;
public $right;
}
// 建立树形为A(B(D(,G)),C(E,F)) 二叉树
$str = 'A(B(D(,G)),C(E,F))';
//创建二叉树
function createTree($str)
{
$len = strlen($str);
$head = NULL;//定义头结点
$p = NULL;//定义指向当前结点
$k = NULL;
$stack = new SplStack();
for($i=0;$i<$len;$i++)
{
$ch = $str{$i};
switch($ch)
{
case '(': //表示有子树 入栈
$k = 1;
$stack->push($p);
break;
case ')':
$stack->pop();
break;
case ',':
$k=2;
break;
default:
$p = new node();
$p->data = $ch;
$p->left = $p->right = NULL;
if($head===NULL) //创建的为头结点
{
$head = $p;
}
else
{
switch($k)
{
case 1://左子树
$stack->top()->left = $p;
break;
case 2:
$stack->top()->right= $p;
break;
}
}
break;
}
}
return $head;
}
$head = createTree($str);
//二叉树遍历
//递归遍历
//先序递归遍历
function RecursivePreOrder($node)
{
if($node!=NULL)
{
echo $node->data,' ';
RecursivePreOrder($node->left);
RecursivePreOrder($node->right);
}
}
echo 'RecursivePreOrder:',RecursivePreOrder($head),"<br/>";
//中序递归遍历
function RecursiveMidOrder($node)
{
if($node!=NULL)
{
RecursiveMidOrder($node->left);
echo $node->data,' ';
RecursiveMidOrder($node->right);
}
}
echo 'RecursiveMidOrder:',RecursiveMidOrder($head),"<br/>";
//后序递归遍历
function RecursivePostOrder($node)
{
if($node!=NULL)
{
RecursivePostOrder($node->left);
RecursivePostOrder($node->right);
echo $node->data,' ';
}
}
echo 'RecursivePostOrder:',RecursivePostOrder($head),'<br/>';
//非递归算法遍历
function PreOrder($node)
{
$stack = new SplStack();
if($node!=NULL)
{
$stack->push($node);
while(!$stack->isEmpty())
{
$pop = $stack->pop();
echo $pop->data,' ';
if($pop->right!=NULl)
{
$stack->push($pop->right);
}
if($pop->left!=NULL)
{
$stack->push($pop->left);
}
}
}
}
echo '<hr>PreOrder:',PreOrder($head),'<br/>';
//中序遍历非递归
function MidOrder($node)
{
if($node!=NULL)
{
$stack = new SplStack();
$top = $node;
while(!$stack->isEmpty()||$top!=NULL)
{
while($top!=NULL)
{
$stack->push($top);
$top = $top->left;
}
if(!$stack->isEmpty())
{
$top = $stack->pop();
echo $top->data,' ';
$top = $top->right;
}
}
}
}
echo 'PreOrder:',MidOrder($head),'<br/>';
function PostOrder($node)
{
if($node!=NULL)
{
$stack = new SplStack();
$top = $node;
do
{
while($top!=NULL)//左子树先入栈
{
$stack->push($top);
$top = $top->left;
}
$p = NULL;
$flag = 1;
while(!$stack->isEmpty()&&$flag)
{
$top = $stack->top();
if($top->right==$p)
{
echo $top->data,' ';
$stack->pop();
$p = $top;
}
else
{
$top = $top->right;
$flag= 0;
}
}
}while(!$stack->isEmpty());
}
}
echo 'PreOrder:',PostOrder($head),'<br/>';
?>
php 实现简单链式二叉树 创建 和遍历
最新推荐文章于 2021-03-11 18:48:15 发布