二叉查找树属于动态查找表,在查找时可插入数据或是删除数据。
基础基于二叉树,只不过它的特点是左子树结点的值永远小于右子树结点的值。
二叉树:由左右子树构成的二叉树。
分类:斜树【即只有左或是右子树】,满二叉树【结点层次一致】,完全二叉树。
遍历算法:【前序,中序,后序,层序】遍历算法
本节基于数据动态构建一个二叉排序数,并完成查找树中结点和删除某个结点功能!!!,用于对树进行创建,删除,查找,展示功能。
/**
* 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的渣渣