php 实现简单链式二叉树 创建 和遍历

<?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/>';




?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值