[PHP] 使用PHP迭代表示二叉树的查找

先用一个数组表示一个二叉树搜索树,也就是一个排好序的二叉树,其中左子结点<根结点<右子结点

利用结构数组的形式来表示,id , left , right 代表结点id ,左子树 ,右子树

下面这个二维数组

$data[]=['id'=>8,'left'=>2,'right'=>10,'data'=>'test'];
$data[]=['id'=>2,'left'=>1,'right'=>0,'data'=>'test1'];
$data[]=['id'=>10,'left'=>0,'right'=>0,'data'=>'test2'];
$data[]=['id'=>1,'left'=>0,'right'=>0,'data'=>'test3'];

转换成成多维的树结构

复制代码
$root=8;
$tree=[];
//遍历
foreach($data as $k=>$v){
    $refer[$v['id']]=&$data[$k];//为每个数组成员建立对应关系
}
//遍历2
foreach($data as $k=>$v){
        $left=&$refer[$v['left']];
        $right=&$refer[$v['right']];
        $data[$k]['left']=&$left;
        $data[$k]['right']=&$right;
}
//遍历3
foreach($data as $k=>$v){
    if($v['id']==$root){
        $tree=$v;
        break;
    }
}
复制代码

结果是:

复制代码
Array
(
    [id] => 8
    [left] => Array
        (
            [id] => 2
            [left] => Array
                (
                    [id] => 1
                    [left] => 
                    [right] => 
                    [data] => test3
                )

            [right] => 
            [data] => test1
        )

    [right] => Array
        (
            [id] => 10
            [left] => 
            [right] => 
            [data] => test2
        )

    [data] => test
)
复制代码

使用迭代的方式来查找,如果值比当前结点小,就把左子树赋给当前树 ,如果大就把右子树赋给当前树

复制代码
function find($tree,$id){
    while(is_array($tree)){
        if($id<$tree['id']){
            $tree=$tree['left'];
        }elseif($id>$tree['id']){
            $tree=$tree['right'];
        }else{
            return $tree;
        }
    }
    return false;
}
复制代码

结果是:

复制代码
$r=find($tree,2);
Array
(
    [id] => 2
    [left] => Array
        (
            [id] => 1
            [left] => 
            [right] => 
            [data] => test3
        )

    [right] => 
    [data] => test1
)
复制代码

 

posted @   唯一客服系统开发笔记  阅读(445)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2019-03-01 [PHP] yield沟通函数循环内外
2019-03-01 [Linux] scp本地服务器和远程服务器拷贝文件
2016-03-01 [android] 分析setting源代码获取SD卡大小
点击右上角即可分享
微信分享提示
1
chat with us