php二叉搜索,二叉查找树 [二叉排序树] 构建和查找算法 PHP 版

二叉查找树属于动态查找表,在查找时可插入数据或是删除数据。

基础基于二叉树,只不过它的特点是左子树结点的值永远小于右子树结点的值。

二叉树:由左右子树构成的二叉树。

分类:斜树【即只有左或是右子树】,满二叉树【结点层次一致】,完全二叉树。

遍历算法:【前序,中序,后序,层序】遍历算法

本节基于数据动态构建一个二叉排序数,并完成查找树中结点和删除某个结点功能!!!,用于对树进行创建,删除,查找,展示功能。

1ccdc472b6f4bc1ee170c2da6fad423b.png

/**

* Created by PhpStorm.

* User: 1655664358@qq.com

* Date: 2019/6/1

* Time: 13:04

*/

/**

* 树结点

* Class Tree

*/

class Tree

{

public $data;

public $LChild;

public $RChild;

}

/**

* 二叉查找树【二叉排序树】

* @param $tree

* @param $data

* @param $f

* @param $temp

* @return bool

*/

function searchBSTree(&$tree,$data,$f,&$temp)

{

if (is_null($tree)){

$temp = $f;

return false;

}

else if ($data==$tree->data){

$temp = $tree;

return true;

}

else if ($datadata){

return searchBSTree($tree->LChild,$data,$tree,$temp);

}else{

return searchBSTree($tree->RChild,$data,$tree,$temp);

}

}

/**

* 构建二叉排序树

* @param $tree

* @param $data

*/

function createBSTree(&$tree,$data)

{

$temp = new Tree();

if (!searchBSTree($tree,$data,null,$temp)){

$obj = new Tree();

$obj->data = $data;

$obj->LChild=$obj->RChild=null;

if (is_null($temp)){

$tree=$obj;

}

elseif($datadata){

$temp->LChild = $obj;

}else{

$temp->RChild = $obj;

}

}

}

/**

* 删除二叉排序树某个结点

* @param $tree

* @return bool

*/

function removeBST(&$tree)

{

if (is_null($tree->RChild)&&is_null($tree->LChild)){

$tree=null;

return true;

}

else if (is_null($tree->LChild)){

$tree = $tree->RChild;

}else if (is_null($tree->RChild)){

$tree = $tree->LChild;

}else{

$temp = $tree;

/** @var Tree $left */

$left = $tree->LChild;

while ($left->RChild){

$temp = $left;

$left = $left->RChild;

}

$tree->data = $left->data;//欲删除结点替换操作

if ($temp!=$tree){

$temp->RChild=$left->LChild;//右子树替换,因为右子树的数据已经替换为删除的结点

}else{

$tree->LChild=$left->LChild;//没有右子树的情况下,直接替换左子树

}

}

}

function deleteBSTree(&$tree,$data)

{

if (is_null($tree)){

return false;

}

elseif($data==$tree->data){

removeBST($tree);

return true;

}else if($datadata){

return deleteBSTree($tree->LChild,$data);

}else{

return deleteBSTree($tree->RChild,$data);

}

}

/**

* 前【先】序遍历

* @param $tree

*/

function displayTree($tree)

{

if (!is_null($tree))

{

fwrite(STDOUT,$tree->data."\n",10);

displayTree($tree->LChild);

displayTree($tree->RChild);

}

}

(function(){

$data = [50,25,30,12,6,20,18,15,26,27,28,29];

$tree = null;

for ($i=0;$i<12;$i++){

createBSTree($tree,$data[$i]);

}

displayTree($tree);

deleteBSTree($tree,50);

fwrite(STDOUT,"************************\n",512);

displayTree($tree);

})();

算法废脑子,自己撸码看看吧^_^

基础依赖于二叉树

本作品采用《CC 协议》,转载必须注明作者和本文链接

只会php crud的渣渣

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值