婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 數據結構之利用PHP實現二分搜索樹

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

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

前言

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

1.二叉樹

1.1 二叉樹圖示

1.2 二叉樹節點定義

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

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

1.3 二叉樹的特點

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

2.二分搜索樹

2.1 二分搜索樹特點

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

2.2 二分搜索樹圖示

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 "nullbr>";
   return;
  }
  echo $root->e . "br>"; //打印當前節點元素
  $this->recursionPreTraversal($root->left, $sign_num + 1);
  $this->recursionPreTraversal($root->right, $sign_num + 1);
 }

下面是打印結果:

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

下面是打印結果:

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

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 "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>";
 }

下面是打印結果:

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

總結

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

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

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

巨人網絡通訊聲明:本文標題《數據結構之利用PHP實現二分搜索樹》,本文關鍵詞  數據結構,之,利用,PHP,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《數據結構之利用PHP實現二分搜索樹》相關的同類信息!
  • 本頁收集關于數據結構之利用PHP實現二分搜索樹的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产91高潮流白浆在线麻豆| 国内精品国产成人国产三级粉色 | 亚洲黄色免费电影| 国产日韩欧美a| 国产亚洲一本大道中文在线| 欧美在线|欧美| 91麻豆国产香蕉久久精品| 色综合咪咪久久| 欧美日本视频在线| 日韩天堂在线观看| 精品国内二区三区| 中文字幕av不卡| 国产精品夫妻自拍| 亚洲一区日韩精品中文字幕| 亚洲成精国产精品女| 一区二区三区在线播放| 久久综合久色欧美综合狠狠| 久久久久久麻豆| 亚洲综合自拍偷拍| 日本中文字幕一区二区有限公司| 麻豆91免费看| 免费精品视频在线| 亚洲人成精品久久久久久| 色悠悠久久综合| 国产精品中文有码| 欧美日韩在线观看一区二区 | 蜜臀91精品一区二区三区| 韩国在线一区二区| av亚洲产国偷v产偷v自拍| 懂色av中文一区二区三区| 91激情在线视频| 2020日本不卡一区二区视频| 国产精品超碰97尤物18| 日韩极品在线观看| 国产盗摄一区二区| 91精品国产综合久久久蜜臀图片| 欧美激情一区二区三区在线| 日韩美女精品在线| 国产真实乱偷精品视频免| 麻豆高清免费国产一区| 免费成人在线网站| 日韩和欧美一区二区| 韩国三级电影一区二区| 亚洲一区二三区| 国产一区二区主播在线| 欧美性猛交xxxxxxxx| 欧美老年两性高潮| 国产午夜精品久久| 日韩中文字幕一区二区三区| 欧美一级理论片| 欧美高清视频一二三区 | 亚洲国产精品一区二区久久| 青青草国产精品97视觉盛宴| 9久草视频在线视频精品| 日韩女优毛片在线| 综合激情成人伊人| 国产成人在线观看免费网站| 欧美日韩中文一区| 久久综合狠狠综合久久激情 | 国产在线精品一区二区| 91伊人久久大香线蕉| 久久久精品一品道一区| 亚洲精品你懂的| 免费三级欧美电影| 欧美一区二区久久| 亚洲国产成人va在线观看天堂| 日韩电影免费在线| 色综合久久综合网欧美综合网| 国产精品嫩草99a| 成人va在线观看| 国产精品毛片高清在线完整版| 精品国产sm最大网站| 一区二区三区四区在线播放| 不卡大黄网站免费看| 国产日产欧产精品推荐色| 国产精品99久久久久久似苏梦涵| 一本色道a无线码一区v| 国产精品久久毛片a| 91丨九色丨蝌蚪丨老版| 亚洲女人的天堂| 色视频一区二区| 亚洲精品欧美综合四区| 国产suv一区二区三区88区| 中文字幕色av一区二区三区| 亚洲成人自拍网| 亚洲国产视频a| 成人亚洲一区二区一| 成人精品鲁一区一区二区| 中文字幕免费在线观看视频一区| 最好看的中文字幕久久| 91麻豆国产精品久久| 中文一区二区在线观看| 欧美日韩在线直播| 亚洲欧美日韩系列| 菠萝蜜视频在线观看一区| 久久一二三国产| 国产美女在线观看一区| 国产欧美精品一区二区色综合| 国产精品久久久久久久岛一牛影视| 久久一区二区三区国产精品| 91麻豆精品91久久久久同性| 国产成人午夜精品5599| 国产精品动漫网站| 91看片淫黄大片一级在线观看| 欧美亚洲日本国产| 午夜激情久久久| 欧美久久免费观看| 美女被吸乳得到大胸91| 97久久精品人人爽人人爽蜜臀| 亚洲成av人片观看| 8v天堂国产在线一区二区| 一区二区成人在线| 3atv在线一区二区三区| 国产精品久久久久久久久免费樱桃 | 三级不卡在线观看| 欧美一区二区三区视频免费播放| 天堂久久久久va久久久久| 国产精品性做久久久久久| 日本一区二区三区视频视频| 免费成人在线观看视频| 久久久综合网站| 亚洲一区二区av电影| 日本高清视频一区二区| 一区二区三区不卡视频| 日本乱人伦aⅴ精品| 亚洲欧美日韩中文播放| 欧美日韩中文字幕一区| 日韩无一区二区| 欧美在线制服丝袜| 日韩成人一级大片| 亚洲综合在线免费观看| 6080国产精品一区二区| 久久精品一区四区| 丁香六月综合激情| 亚洲国产精品黑人久久久| 麻豆精品一区二区综合av| 国产欧美日产一区| 日韩av电影免费观看高清完整版 | 国产成人在线免费| 一二三四社区欧美黄| 91精品国产免费| 加勒比av一区二区| 国产麻豆日韩欧美久久| 日韩激情中文字幕| 久久er99精品| 国产精品麻豆一区二区| 中文字幕一区二| 免费成人av在线播放| 国产suv一区二区三区88区| 色婷婷亚洲精品| 精品国产网站在线观看| 亚洲欧美另类在线| 国产精品一区二区三区四区| 一本久道久久综合中文字幕| 日韩欧美色综合网站| 亚洲色大成网站www久久九九| 欧美aa在线视频| 一本大道av一区二区在线播放| 日韩精品一区国产麻豆| 亚洲六月丁香色婷婷综合久久 | 99视频在线观看一区三区| 欧美伦理电影网| 国产精品久久久久aaaa樱花 | 欧美激情一区二区三区全黄| 亚洲国产精品久久久男人的天堂| 国产九九视频一区二区三区| 在线观看欧美黄色| 久久久高清一区二区三区| 国产精品一区久久久久| 99re热视频这里只精品| 在线视频观看一区| 亚洲精品乱码久久久久久| 91天堂素人约啪| aaa国产一区| 中文字幕一区在线| 欧美日韩在线观看一区二区| 久久疯狂做爰流白浆xx| 午夜精品免费在线观看| 成人一区二区三区在线观看| 欧美一级黄色大片| 夜夜精品浪潮av一区二区三区| 国产成人a级片| 91婷婷韩国欧美一区二区| 国产色一区二区| 国产一区二区三区四区五区入口| 欧美另类久久久品| 欧美国产禁国产网站cc| 国产乱色国产精品免费视频| 欧美成人精品福利| 视频在线观看一区二区三区| 在线精品视频免费播放| 一区二区三区在线观看视频| 色综合咪咪久久| 亚洲一级二级在线| 欧美影视一区在线| 亚洲国产一区二区视频| 欧美手机在线视频| 性做久久久久久久免费看| 884aa四虎影成人精品一区| 免费一级欧美片在线观看|