欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

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

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

熱門標簽:招標自動語音外呼系統(tǒng) gps 地圖標注軟件 黔江400電話如何辦理 OMG地圖標注app 地圖標注視頻廣告入駐 ai電話機器人加盟代理 電銷機器人便宜的有嗎 中原區(qū)電話機器人價格 400電話鄭州申請

前言

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

1.二叉樹

1.1 二叉樹圖示

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

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

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

1.3 二叉樹的特點

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

2.二分搜索樹

2.1 二分搜索樹特點

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

2.2 二分搜索樹圖示

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

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

2.4 向二分搜索樹添加元素

下面展示的的使用遞歸思想向二分搜索樹添加元素,其中 add($e) 方法表示想二分搜索樹添加元素 $e,recursionAdd(Node $root, $e) 是一個遞歸函數(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é)點為空則添加元素 并且返回當前節(jié)點信息
   $this->size++;
   $root = new Node($e);
  } elseif ($e  $root->e) { //若元素小于當前節(jié)點元素 則向左節(jié)點遞歸添加元素
   $root->left = $this->recursionAdd($root->left, $e);
  } elseif ($e > $root->e) { //若元素大于當前節(jié)點元素 則向右節(jié)點遞歸添加元素
   $root->right = $this->recursionAdd($root->right, $e);
  } //若元素等于當前節(jié)點元素 則什么都不做
 }

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

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

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

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

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

2.6 二分搜索樹前序遍歷

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

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

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

?php
require '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);
//下面是預期想要的結(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é)果和預期一致。

2.7 二分搜索樹中序遍歷

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

 /**
  * 中序遍歷
  */
 public function midTraversal() {
  $this->recursionMidTraversal($this->root, 0);
 }
 /**
  * 中序遍歷的遞歸
  */
 public function recursionMidTraversal($root, $sign_num) {
  if ($root == null) {
   echo $this->getSign($sign_num);//打印深度
   echo "nullbr>";
   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é)果:

?php
require '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);
//下面是預期想要的結(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
---------------null
45
--------------------null
---------------48
--------------------null
----------50
---------------null
-----55
--------------------null
---------------60
--------------------null
----------65
--------------------null
---------------68
--------------------null
 */

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

2.8 二分搜索樹后序遍歷

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

 /**
  * 后序遍歷
  */
 public function rearTraversal() {
  $this->recursionRearTraversal($this->root, 0);
 }
 /**
  * 后序遍歷的遞歸
  */
 public function recursionRearTraversal($root, $sign_num) {
  if ($root == null) {
   echo $this->getSign($sign_num);//打印深度
   echo "nullbr>";
   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é)果:

?php
require '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);
//下面是預期想要的結(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
-----55
45
 */

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

總結(jié)

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

您可能感興趣的文章:
  • 使用PHP實現(xiàn)二分查找算法代碼分享
  • PHP 冒泡排序 二分查找 順序查找 二維數(shù)組排序算法函數(shù)的詳解
  • php二分法在IP地址查詢中的應(yīng)用
  • php二分查找二種實現(xiàn)示例
  • 深入理解PHP幾個算法:PHP冒泡、PHP二分法、PHP求素數(shù)、PHP乘法表
  • PHP字符串逆序排列實現(xiàn)方法小結(jié)【strrev函數(shù),二分法,循環(huán)法,遞歸法】
  • php順序查找和二分查找示例
  • php 數(shù)組二分法查找函數(shù)代碼
  • php數(shù)據(jù)結(jié)構(gòu)與算法(PHP描述) 查找與二分法查找
  • php中二分法查找算法實例分析

標簽:阿里 北京 濟源 池州 日照 孝感 哈密 那曲

巨人網(wǎng)絡(luò)通訊聲明:本文標題《數(shù)據(jù)結(jié)構(gòu)之利用PHP實現(xiàn)二分搜索樹》,本文關(guān)鍵詞  數(shù)據(jù)結(jié)構(gòu),之,利用,PHP,實現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《數(shù)據(jù)結(jié)構(gòu)之利用PHP實現(xiàn)二分搜索樹》相關(guān)的同類信息!
  • 本頁收集關(guān)于數(shù)據(jù)結(jié)構(gòu)之利用PHP實現(xiàn)二分搜索樹的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美变态凌虐bdsm| 久久99精品一区二区三区三区| 国产毛片精品国产一区二区三区| 性欧美丰满熟妇xxxx性久久久| 欧美少妇xxx| 亚洲曰韩产成在线| 国产xxx在线观看 | 天天综合日日夜夜精品| 国产精品成人免费一区久久羞羞| 欧美视频中文字幕| 亚洲曰韩产成在线| 国产51自产区| 欧美一级日韩不卡播放免费| 日韩一区精品视频| 久久久久国产精品区片区无码| 91精品国产91热久久久做人人| 日韩vs国产vs欧美| 成人黄色a级片| 国产色91在线| 成人黄色一级视频| 91久久精品国产91性色tv| 一区二区三区在线免费| 一区二区在线免费观看视频| 欧美人成免费网站| 美女视频网站久久| 东京热无码av男人的天堂| 国产欧美日韩另类一区| av资源网一区| 欧美日韩国产影片| 日本美女一区二区三区| 国产1区2区在线观看| 欧美国产一区在线| 91蜜桃视频在线| 3d成人h动漫网站入口| 免费成人在线网站| 国产探花视频在线| 亚洲女同一区二区| 97人妻精品一区二区三区免费| 日韩欧美中文一区二区| 国产在线播放一区| 色综合色综合色综合色综合色综合 | 色天天综合久久久久综合片| 亚洲综合一二三区| 国产jjizz一区二区三区视频| 中文字幕高清不卡| 中文字幕一二三区| 26uuu亚洲| 99久久免费视频.com| 欧美精品粉嫩高潮一区二区| 裸体歌舞表演一区二区| 加勒比婷婷色综合久久| 视频在线在亚洲| 国精产品视频一二二区| 亚洲一区二区三区中文字幕| 成人免费看aa片| 亚洲人成7777| 久久丫精品国产亚洲av不卡| 国产精品美女久久久久久久网站| 少妇伦子伦精品无吗| 久久性爱视频网站| 精品国产乱码久久久久久闺蜜| 成人小视频免费观看| 在线成人小视频| 国产精品资源网站| 制服丝袜中文字幕一区| 国产精品18久久久久久久网站| 精品视频在线免费| 国产高清视频一区| 91精品婷婷国产综合久久性色| 国产a精品视频| 911精品产国品一二三产区| 国产成人免费视频精品含羞草妖精 | 粉嫩aⅴ一区二区三区四区五区| 欧美久久久久久久久| 国产69精品一区二区亚洲孕妇| 69堂精品视频| 成人一级视频在线观看| 日韩精品专区在线影院观看| av一二三不卡影片| 久久日一线二线三线suv| 少妇搡bbbb搡bbb搡打电话| 欧美激情中文字幕一区二区| 成人性生活免费看| 亚洲女人小视频在线观看| 国产探花视频在线播放| 调教+趴+乳夹+国产+精品| 色狠狠色狠狠综合| 国产精品小仙女| 日韩精品专区在线| 天天躁日日躁狠狠躁免费麻豆| 国产精品福利一区二区三区| 级毛片内射视频| 午夜视频一区二区三区| 国产a免费视频| 国产一区二区三区在线观看精品 | 99麻豆久久久国产精品免费优播| 久久在线观看免费| 超碰97在线资源站| 亚洲国产成人av网| 欧美又粗又大又爽| www.亚洲精品| 中文av一区特黄| 国产传媒视频在线| 捆绑调教美女网站视频一区| 91麻豆精品国产91久久久久久久久| 99久久99久久精品国产片果冻| 日本一区二区不卡视频| 日本综合在线观看| 久久精品国产成人一区二区三区 | 黄免费在线观看| 日本欧美大码aⅴ在线播放| 欧美片在线播放| 精品伦一区二区三区| 亚洲美女在线一区| 一本大道综合伊人精品热热| 国产成人一区在线| 日本一二三四高清不卡| 国产精品视频一区二区在线观看| 精品伊人久久久久7777人| 欧美v日韩v国产v| 亚洲熟妇一区二区三区| 日本午夜一区二区| 日韩欧美一二三四区| 国产精品久久无码| 日本视频在线一区| 日韩女优毛片在线| 香蕉影视欧美成人| 欧美色图一区二区三区| 最新中文字幕日本| 丝袜美腿亚洲色图| 日韩亚洲欧美一区二区三区| 少妇按摩一区二区三区| 蜜臂av日日欢夜夜爽一区| 精品国产一区二区三区四区四| 91精品人妻一区二区三区蜜桃欧美 | 欧美另类高清zo欧美| 成人区人妻精品一区二| 视频一区二区中文字幕| 日韩精品一区二区三区视频| 国产真实乱人偷精品人妻| 国模套图日韩精品一区二区| 欧美国产日韩一二三区| 色综合天天天天做夜夜夜夜做| 99精品国产99久久久久久白柏| 亚洲精品国产无天堂网2021 | 粉嫩久久99精品久久久久久夜| 中文字幕一区二区三区在线播放 | 日韩欧美美女一区二区三区| 在线免费观看麻豆| 国产福利一区在线| 亚洲精品久久久蜜桃| 欧美精品欧美精品系列| 欧美bbbbb性bbbbb视频| 国产揄拍国内精品对白| 国产精品久久久久影视| 欧美亚洲禁片免费| 日本高清www| 国产91丝袜在线18| 一级精品视频在线观看宜春院 | 亚洲ⅴ国产v天堂a无码二区| 国产成a人无v码亚洲福利| 亚洲欧美日韩一区| 欧美一区二区三区婷婷月色| 国产午夜精品久久久久久久久| 成人性生交大片免费看视频在线 | 日韩欧美国产麻豆| 日韩欧美视频免费观看| 91浏览器打开| 美女视频免费一区| 国产精品国产三级国产有无不卡| 欧美日韩一区高清| 蜜乳av中文字幕| 小日子的在线观看免费第8集| 欧美aa在线视频| 国产精品黄色在线观看| 欧美日韩精品一区二区三区蜜桃| 新91视频在线观看| 99久久er热在这里只有精品15| 日韩国产欧美三级| 国产精品美女久久久久久2018| 欧美日韩和欧美的一区二区| 免费黄色在线网址| 国产精久久久久| 国产经典欧美精品| 五月激情丁香一区二区三区| 久久精品一二三| 欧美高清视频在线高清观看mv色露露十八 | 国产日韩欧美高清| 欧美日本乱大交xxxxx| 91麻豆制片厂| 亚洲av熟女高潮一区二区| 国产91丝袜在线播放0| 色噜噜久久综合| 欧美色图亚洲激情| 99久久99久久综合| 韩国成人在线视频| 偷拍日韩校园综合在线| 国产精品久久毛片av大全日韩| 91精品视频网| 91福利在线播放|