日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

數據結構之利用PHP實現二分搜索樹

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

前言

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

1.二叉樹

1.1 二叉樹圖示

數據結構之利用PHP實現二分搜索樹

1.2 二叉樹節點定義

//二叉樹具有唯一根節點class Node{ $e; //節點元素 $left; //左兒子 $right;//右兒子}

Tips:二叉樹每個節點最多有兩個兒子,每個節點最多有一個父親。

1.3 二叉樹的特點

二叉樹具有天然的遞歸結構,每個節點的左兒子或右兒子也是 二叉樹。 二叉樹不一定是滿的,可能只有左兒子或又兒子。 一個節點或 NULL 也可以看做一個二叉樹。

2.二分搜索樹

2.1 二分搜索樹特點

二分搜索樹是二叉樹。 每個節點的元素的值都要大于左兒子所有節點的值。 每個節點的元素的值都要小于右兒子所有節點的值。 每個子樹也是二分搜索樹。 二分搜索樹查詢速度快。 存儲的元素必須要有比較性。

2.2 二分搜索樹圖示

數據結構之利用PHP實現二分搜索樹

2.3 PHP 代碼定義節點

class Node{ public $e; public $left = null; public $right = null; /** * 構造函數 初始化節點數據 * Node constructor. * @param $e */ public function __construct($e) { $this->e = $e; }}

2.4 向二分搜索樹添加元素

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

/** * 向二分搜索樹添加元素 * @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) { //若節點為空則添加元素 并且返回當前節點信息 $this->size++; $root = new Node($e); } elseif ($e < $root->e) { //若元素小于當前節點元素 則向左節點遞歸添加元素 $root->left = $this->recursionAdd($root->left, $e); } elseif ($e > $root->e) { //若元素大于當前節點元素 則向右節點遞歸添加元素 $root->right = $this->recursionAdd($root->right, $e); } //若元素等于當前節點元素 則什么都不做 }

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

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

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

/** * 判斷二分搜索樹是否包含某個元素 * @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) { //若當前節點為空 則表示不存在元素 $e return false; } elseif ($e == $root->e) { //若 $e 等于當前節點元素,則表示樹包含元素 $e return true; } elseif ($e < $root->e) { //若 $e 小于當前節點元素,則去左兒子樹遞歸查詢是否包含節點 return $this->recursionContains($root->left, $e); } else { //若 $e 大于當前節點元素,則去右兒子樹遞歸查詢是否包含節點 return $this->recursionContains($root->right, $e); } }

Tips:遞歸的時候會比較元素和節點的值,遞歸的時候判斷元素大小相當于 “指路”,最終指向到的位置就是判斷是否包含元素是否存在的依據。

2.6 二分搜索樹前序遍歷

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

/** * 前序遍歷 */ 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>'; //打印當前節點元素 $this->recursionPreTraversal($root->left, $sign_num + 1); $this->recursionPreTraversal($root->right, $sign_num + 1); }

下面是打印結果:

<?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);//下面是預期想要的結果/** * 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:可以看到打印輸出結果和預期一致。

2.7 二分搜索樹中序遍歷

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

/** * 中序遍歷 */ 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); }

下面是打印結果:

<?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);//下面是預期想要的結果/** * 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:可以看到打印輸出結果和預期一致,但是此時的遍歷順序變了,最后的順序輸出結果是有序的。

2.8 二分搜索樹后序遍歷

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

/** * 后序遍歷 */ 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>'; }

下面是打印結果:

<?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);//下面是預期想要的結果/** * 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...

總結

到此這篇關于數據結構之利用PHP實現二分搜索樹的文章就介紹到這了,更多相關PHP實現二分搜索樹內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩尤物久久| 99亚洲视频| 亚洲精品亚洲人成在线观看| 91av亚洲| 成人国产综合| 久久精品国产网站| 精品国产黄a∨片高清在线| 国产色噜噜噜91在线精品| 欧美亚洲一区二区三区| 日韩福利视频导航| 久久精品99国产精品日本| 日本在线不卡视频| 欧美三区不卡| 国产激情一区| 97人人精品| 久久青草久久| 欧美久久精品一级c片| 亚洲激情社区| 午夜国产欧美理论在线播放 | 亚洲午夜视频| 99pao成人国产永久免费视频| 国产一区白浆| 亚洲精品成人一区| 国产日韩欧美三级| 麻豆精品新av中文字幕| 欧美激情91| 国产精品乱战久久久| www.九色在线| 黄色日韩精品| 中文字幕一区二区三区四区久久| 亚洲天堂av资源在线观看| 日日夜夜免费精品视频| 亚洲专区视频| 国产毛片一区二区三区| 国产成人77亚洲精品www| 日本午夜大片a在线观看| 久久美女精品| 亚久久调教视频| 欧美精品aa| 国产 日韩 欧美一区| 亚洲激情另类| 国产亚洲人成a在线v网站| 久久久久伊人| 99久久婷婷| 男女性色大片免费观看一区二区| 日韩国产在线观看| 精品午夜av| 久久三级视频| 午夜电影一区| 水蜜桃久久夜色精品一区| 欧美精品一区二区三区精品| 日韩精品成人在线观看| 另类亚洲自拍| 免费精品一区| 欧美精品自拍| 国产精品亚洲片在线播放| 欧美香蕉视频| 亚洲精品三级| 人人爽香蕉精品| 国产一区二区三区四区二区| 日韩视频免费| 国产精品久久久久久av公交车| 成人国产精品一区二区网站| 香蕉久久久久久久av网站| 精品一区二区三区的国产在线观看 | 女生影院久久| 视频在线观看91| 精品国产一级| 丝袜a∨在线一区二区三区不卡| 欧美国产精品| 亚洲主播在线| 欧美国产中文高清| 99在线观看免费视频精品观看| 国产精品中文字幕亚洲欧美| 午夜久久福利| 久久久久97| 四虎4545www国产精品 | 欧美国产免费| 久久国产精品99国产| 日韩综合在线| 日韩美女国产精品| 久久在线视频免费观看| 免费看一区二区三区| 欧美日韩国产综合网| 欧美a级一区二区| 亚洲人亚洲人色久| 国产一区视频在线观看免费| 麻豆精品在线| 日韩1区2区3区| 午夜久久免费观看| 韩国一区二区三区视频| 日韩精品乱码av一区二区| 亚洲女同一区| 色在线视频观看| 国产精品扒开腿做爽爽爽软件| 一区在线视频观看| 日韩在线中文| 国产精品色婷婷在线观看| 国产一区二区高清| 成人羞羞在线观看网站| 久久成人av| 欧美日韩中文| 日韩高清不卡一区| 日韩精品电影一区亚洲| 中文字幕日本一区| 亚洲综合电影一区二区三区| 女同性一区二区三区人了人一| 天堂av在线| 国产高潮在线| 精品深夜福利视频| 国产极品一区| 国产精品qvod| 国产精品久久久久久久久久白浆| 亚洲香蕉视频| 免费久久精品视频| 在线观看一区| 亚洲综合中文| 日日摸夜夜添夜夜添国产精品| 婷婷色综合网| 成人羞羞在线观看网站| 国内自拍视频一区二区三区| 国产精品一国产精品k频道56| 欧美日韩国产高清电影| 中文一区一区三区高中清不卡免费| 欧美日韩伊人| 中文一区在线| 久久国产精品久久w女人spa| 欧美午夜精彩| 麻豆成全视频免费观看在线看| 久久国产三级精品| 日韩在线成人| 日韩影院免费视频| 亚洲午夜免费| 蜜臀av亚洲一区中文字幕| 女人av一区| 久久激情一区| 午夜欧美巨大性欧美巨大| 国产精品红桃| 精品国产亚洲一区二区在线观看| 国产乱人伦精品一区| 日本视频一区二区| 视频一区日韩精品| 亚洲精品日韩久久| 亚洲永久字幕| 一本综合精品| 亚洲三级视频| 亚洲欧洲专区| 偷拍亚洲精品| 亚洲va久久| 麻豆成人在线| 国产色99精品9i| 国产情侣久久| 国产精品777777在线播放| 国产精品黄网站| 久久久久九九精品影院| 超碰在线99| 桃色一区二区| 久久精品国产亚洲夜色av网站| 蜜臀国产一区| 在线观看精品| 久久久久国产一区二区| 亚洲欧美日韩国产一区二区| 亚洲一区二区动漫| 伊人www22综合色| 亚洲精品观看| 欧美一级二级三级视频| 蜜桃视频一区二区| 欧美黄页在线免费观看 | 欧美天堂亚洲电影院在线观看| 欧美综合另类| 亚洲免费一区二区| 视频一区免费在线观看| 影音先锋国产精品| 日韩和欧美一区二区| 国产欧美日韩精品高清二区综合区 | 首页欧美精品中文字幕| 国产乱子精品一区二区在线观看| 国产精品亚洲产品| 国产精品第一| 国内精品美女在线观看| 亚洲电影有码| 亚洲无线一线二线三线区别av| 亚洲一区日本| 91大神在线观看线路一区| 美女视频黄 久久| 成人精品天堂一区二区三区| 五月精品视频| 欧美一区久久| 日本激情一区| 国产免费成人| 国产精品久久久久久久久免费高清 | 亚洲丝袜美腿一区| 国产精品a级| 成人久久一区| 免费在线看一区| 麻豆国产欧美日韩综合精品二区| 亚洲va在线| 国产精品麻豆成人av电影艾秋| 裤袜国产欧美精品一区| 中文亚洲免费|