电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹

瀏覽:107日期:2022-09-08 18:34:29

前言

這篇文章是介紹 二叉樹 和 二分搜索樹,然后通過 PHP 代碼定義一下 二分搜索樹 的節(jié)點(diǎn),使用遞歸思想操作向二分搜索樹添加元素,然后實(shí)現(xiàn)了遞歸判斷二分搜索樹上是否包含某個(gè)元素,最后分別實(shí)現(xiàn)了前序遍歷、中序遍歷、后序遍歷 二分搜索樹。

1.二叉樹

1.1 二叉樹圖示

數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹

1.2 二叉樹節(jié)點(diǎn)定義

//二叉樹具有唯一根節(jié)點(diǎn)class Node{ $e; //節(jié)點(diǎn)元素 $left; //左兒子 $right;//右兒子}

Tips:二叉樹每個(gè)節(jié)點(diǎn)最多有兩個(gè)兒子,每個(gè)節(jié)點(diǎn)最多有一個(gè)父親。

1.3 二叉樹的特點(diǎn)

二叉樹具有天然的遞歸結(jié)構(gòu),每個(gè)節(jié)點(diǎn)的左兒子或右兒子也是 二叉樹。 二叉樹不一定是滿的,可能只有左兒子或又兒子。 一個(gè)節(jié)點(diǎn)或 NULL 也可以看做一個(gè)二叉樹。

2.二分搜索樹

2.1 二分搜索樹特點(diǎn)

二分搜索樹是二叉樹。 每個(gè)節(jié)點(diǎn)的元素的值都要大于左兒子所有節(jié)點(diǎn)的值。 每個(gè)節(jié)點(diǎn)的元素的值都要小于右兒子所有節(jié)點(diǎn)的值。 每個(gè)子樹也是二分搜索樹。 二分搜索樹查詢速度快。 存儲(chǔ)的元素必須要有比較性。

2.2 二分搜索樹圖示

數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹

2.3 PHP 代碼定義節(jié)點(diǎn)

class Node{ public $e; public $left = null; public $right = null; /** * 構(gòu)造函數(shù) 初始化節(jié)點(diǎn)數(shù)據(jù) * Node constructor. * @param $e */ public function __construct($e) { $this->e = $e; }}

2.4 向二分搜索樹添加元素

下面展示的的使用遞歸思想向二分搜索樹添加元素,其中 add($e) 方法表示想二分搜索樹添加元素 $e,recursionAdd(Node $root, $e) 是一個(gè)遞歸函數(shù),表示使用遞歸向二分搜索樹添加元素:

/** * 向二分搜索樹添加元素 * @param $e */ public function add($e) { $this->root = $this->recursionAdd($this->root, $e); } /** * 遞歸向二分搜索樹添加元素 * @param Node $root * @param $e */ public function recursionAdd(Node $root, $e) { if ($root == null) { //若節(jié)點(diǎn)為空則添加元素 并且返回當(dāng)前節(jié)點(diǎn)信息 $this->size++; $root = new Node($e); } elseif ($e < $root->e) { //若元素小于當(dāng)前節(jié)點(diǎn)元素 則向左節(jié)點(diǎn)遞歸添加元素 $root->left = $this->recursionAdd($root->left, $e); } elseif ($e > $root->e) { //若元素大于當(dāng)前節(jié)點(diǎn)元素 則向右節(jié)點(diǎn)遞歸添加元素 $root->right = $this->recursionAdd($root->right, $e); } //若元素等于當(dāng)前節(jié)點(diǎn)元素 則什么都不做 }

Tips:這里的二分搜索樹不包含重復(fù)元素,如果想要包含重復(fù)元素,可以定義每個(gè)左兒子所有元素小于等于父親節(jié)點(diǎn),或者每個(gè)節(jié)點(diǎn)右兒子所有節(jié)點(diǎn)元素大于等于父親節(jié)點(diǎn)。

2.5 查詢二分搜索樹是否包含某個(gè)元素

下面展示的的使用遞歸思想查詢二分搜索樹元素是否包含某個(gè)元素,其中 contains($e) 方法表示查詢二分搜索樹是否包含元素 $e,recursionContains(Node $root, $e) 是一個(gè)遞歸函數(shù),表示使用遞歸查詢二分搜索樹元素:

/** * 判斷二分搜索樹是否包含某個(gè)元素 * @param $e * @return bool */ public function contains($e): bool { return $this->recursionContains($this->root, $e); } /** * 遞歸判斷二分搜索樹是否包含某元素 * @param $root * @param $e * @return bool */ private function recursionContains(Node $root, $e): bool { if ($root == null) { //若當(dāng)前節(jié)點(diǎn)為空 則表示不存在元素 $e return false; } elseif ($e == $root->e) { //若 $e 等于當(dāng)前節(jié)點(diǎn)元素,則表示樹包含元素 $e return true; } elseif ($e < $root->e) { //若 $e 小于當(dāng)前節(jié)點(diǎn)元素,則去左兒子樹遞歸查詢是否包含節(jié)點(diǎn) return $this->recursionContains($root->left, $e); } else { //若 $e 大于當(dāng)前節(jié)點(diǎn)元素,則去右兒子樹遞歸查詢是否包含節(jié)點(diǎn) return $this->recursionContains($root->right, $e); } }

Tips:遞歸的時(shí)候會(huì)比較元素和節(jié)點(diǎn)的值,遞歸的時(shí)候判斷元素大小相當(dāng)于 “指路”,最終指向到的位置就是判斷是否包含元素是否存在的依據(jù)。

2.6 二分搜索樹前序遍歷

前序遍歷操作就是把所有節(jié)點(diǎn)都訪問一次,前序遍歷 是先訪問節(jié)點(diǎn),再遞歸遍歷左兒子樹,然后再遞歸遍歷右兒子樹:

/** * 前序遍歷 */ public function preTraversal() { $this->recursionPreTraversal($this->root, 0); } /** * 前序遍歷的遞歸 */ public function recursionPreTraversal($root, $sign_num) { echo $this->getSign($sign_num);//打印深度 if ($root == null) { echo 'null<br>'; return; } echo $root->e . '<br>'; //打印當(dāng)前節(jié)點(diǎn)元素 $this->recursionPreTraversal($root->left, $sign_num + 1); $this->recursionPreTraversal($root->right, $sign_num + 1); }

下面是打印結(jié)果:

<?phprequire ’BinarySearchTree.php’;$binarySearchTree = new BinarySearchTree();$binarySearchTree->add(45);$binarySearchTree->add(30);$binarySearchTree->add(55);$binarySearchTree->add(25);$binarySearchTree->add(35);$binarySearchTree->add(50);$binarySearchTree->add(65);$binarySearchTree->add(15);$binarySearchTree->add(27);$binarySearchTree->add(31);$binarySearchTree->add(48);$binarySearchTree->add(60);$binarySearchTree->add(68);//下面是預(yù)期想要的結(jié)果/** * 45 * / * 30 55 */ / * 25 35 50 65 * / / / / * 15 27 31 48 60 68 * */$binarySearchTree->preTraversal();/**打印輸出45-----30----------25---------------15--------------------null--------------------null---------------27--------------------null--------------------null----------35---------------31--------------------null--------------------null---------------null-----55----------50---------------48--------------------null--------------------null---------------null----------65---------------60--------------------null--------------------null---------------68--------------------null--------------------null */

Tips:可以看到打印輸出結(jié)果和預(yù)期一致。

2.7 二分搜索樹中序遍歷

遍歷操作就是把所有節(jié)點(diǎn)都訪問一次,后序遍歷 是先遞歸遍歷右兒子樹,再訪問節(jié)點(diǎn),然后再遞歸遍歷右兒子樹,最后的順序輸出結(jié)果是有序的:

/** * 中序遍歷 */ public function midTraversal() { $this->recursionMidTraversal($this->root, 0); } /** * 中序遍歷的遞歸 */ public function recursionMidTraversal($root, $sign_num) { if ($root == null) { echo $this->getSign($sign_num);//打印深度 echo 'null<br>'; return; } $this->recursionMidTraversal($root->left, $sign_num + 1); echo $this->getSign($sign_num);//打印深度 echo $root->e . '<br>'; $this->recursionMidTraversal($root->right, $sign_num + 1); }

下面是打印結(jié)果:

<?phprequire ’BinarySearchTree.php’;$binarySearchTree = new BinarySearchTree();$binarySearchTree->add(45);$binarySearchTree->add(30);$binarySearchTree->add(55);$binarySearchTree->add(25);$binarySearchTree->add(35);$binarySearchTree->add(50);$binarySearchTree->add(65);$binarySearchTree->add(15);$binarySearchTree->add(27);$binarySearchTree->add(31);$binarySearchTree->add(48);$binarySearchTree->add(60);$binarySearchTree->add(68);//下面是預(yù)期想要的結(jié)果/** * 45 * / * 30 55 */ / * 25 35 50 65 * / / / / * 15 27 31 48 60 68 * */$binarySearchTree->midTraversal();/**打印輸出--------------------null---------------15--------------------null----------25--------------------null---------------27--------------------null-----30--------------------null---------------31--------------------null----------35---------------null45--------------------null---------------48--------------------null----------50---------------null-----55--------------------null---------------60--------------------null----------65--------------------null---------------68--------------------null */

Tips:可以看到打印輸出結(jié)果和預(yù)期一致,但是此時(shí)的遍歷順序變了,最后的順序輸出結(jié)果是有序的。

2.8 二分搜索樹后序遍歷

遍歷操作就是把所有節(jié)點(diǎn)都訪問一次,后序遍歷 是先遞歸遍歷左兒子樹,然后再遞歸遍歷右兒子樹,再訪問節(jié)點(diǎn):

/** * 后序遍歷 */ public function rearTraversal() { $this->recursionRearTraversal($this->root, 0); } /** * 后序遍歷的遞歸 */ public function recursionRearTraversal($root, $sign_num) { if ($root == null) { echo $this->getSign($sign_num);//打印深度 echo 'null<br>'; return; } $this->recursionRearTraversal($root->left, $sign_num + 1); $this->recursionRearTraversal($root->right, $sign_num + 1); echo $this->getSign($sign_num);//打印深度 echo $root->e . '<br>'; }

下面是打印結(jié)果:

<?phprequire ’BinarySearchTree.php’;$binarySearchTree = new BinarySearchTree();$binarySearchTree->add(45);$binarySearchTree->add(30);$binarySearchTree->add(55);$binarySearchTree->add(25);$binarySearchTree->add(35);$binarySearchTree->add(50);$binarySearchTree->add(65);$binarySearchTree->add(15);$binarySearchTree->add(27);$binarySearchTree->add(31);$binarySearchTree->add(48);$binarySearchTree->add(60);$binarySearchTree->add(68);//下面是預(yù)期想要的結(jié)果/** * 45 * / * 30 55 */ / * 25 35 50 65 * / / / / * 15 27 31 48 60 68 * */$binarySearchTree->rearTraversal();/**打印輸出--------------------null--------------------null---------------15--------------------null--------------------null---------------27----------25--------------------null--------------------null---------------31---------------null----------35-----30--------------------null--------------------null---------------48---------------null----------50--------------------null--------------------null---------------60--------------------null--------------------null---------------68----------65-----5545 */

代碼倉庫 :https://gitee.com/love-for-po...

總結(jié)

到此這篇關(guān)于數(shù)據(jù)結(jié)構(gòu)之利用PHP實(shí)現(xiàn)二分搜索樹的文章就介紹到這了,更多相關(guān)PHP實(shí)現(xiàn)二分搜索樹內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 污水处理设备-海普欧环保集团有限公司 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 方源木业官网-四川木门-全国木门专业品牌| J.S.Bach 圣巴赫_高端背景音乐系统_官网 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 点胶机_点胶阀_自动点胶机_智能点胶机_喷胶机_点胶机厂家【欧力克斯】 | 家乐事净水器官网-净水器厂家「官方」 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 河南中专学校|职高|技校招生-河南中职中专网 | 净化车间_洁净厂房_净化公司_净化厂房_无尘室工程_洁净工程装修|改造|施工-深圳净化公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 楼承板-钢筋楼承板-闭口楼承板-无锡优贝斯楼承板厂 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 周口风机|周风风机|河南省周口通用风机厂 | 深圳货架厂家_金丽声精品货架_广东金丽声展示设备有限公司官网 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 金蝶帐无忧|云代账软件|智能财税软件|会计代账公司专用软件 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 |