php實(shí)現(xiàn)的二叉樹遍歷算法示例
本文實(shí)例講述了php實(shí)現(xiàn)的二叉樹遍歷算法。分享給大家供大家參考,具體如下:
今天使用php來實(shí)現(xiàn)二叉樹的遍歷
創(chuàng)建的二叉樹如下圖所示

php代碼如下所示:
<?php
class Node {
public $value;
public $child_left;
public $child_right;
}
final class Ergodic {
//前序遍歷:先訪問根節(jié)點(diǎn),再遍歷左子樹,最后遍歷右子樹;并且在遍歷左右子樹時(shí),仍需先遍歷根節(jié)點(diǎn),然后訪問左子樹,最后遍歷右子樹
public static function preOrder($root){
$stack = array();
array_push($stack, $root);
while(!empty($stack)){
$center_node = array_pop($stack);
echo $center_node->value . ' ';
//先把右子樹節(jié)點(diǎn)入棧,以確保左子樹節(jié)點(diǎn)先出棧
if($center_node->child_right != null) array_push($stack, $center_node->child_right);
if($center_node->child_left != null) array_push($stack, $center_node->child_left);
}
}
//中序遍歷:先遍歷左子樹、然后訪問根節(jié)點(diǎn),最后遍歷右子樹;并且在遍歷左右子樹的時(shí)候。仍然是先遍歷左子樹,然后訪問根節(jié)點(diǎn),最后遍歷右子樹
public static function midOrder($root){
$stack = array();
$center_node = $root;
while (!empty($stack) || $center_node != null) {
while ($center_node != null) {
array_push($stack, $center_node);
$center_node = $center_node->child_left;
}
$center_node = array_pop($stack);
echo $center_node->value . ' ';
$center_node = $center_node->child_right;
}
}
//后序遍歷:先遍歷左子樹,然后遍歷右子樹,最后訪問根節(jié)點(diǎn);同樣,在遍歷左右子樹的時(shí)候同樣要先遍歷左子樹,然后遍歷右子樹,最后訪問根節(jié)點(diǎn)
public static function endOrder($root){
$push_stack = array();
$visit_stack = array();
array_push($push_stack, $root);
while (!empty($push_stack)) {
$center_node = array_pop($push_stack);
array_push($visit_stack, $center_node);
//左子樹節(jié)點(diǎn)先入$pushstack的棧,確保在$visitstack中先出棧
if ($center_node->child_left != null) array_push($push_stack, $center_node->child_left);
if ($center_node->child_right != null) array_push($push_stack, $center_node->child_right);
}
while (!empty($visit_stack)) {
$center_node = array_pop($visit_stack);
echo $center_node->value . ' ';
}
}
}
//創(chuàng)建二叉樹
$a = new Node();
$b = new Node();
$c = new Node();
$d = new Node();
$e = new Node();
$f = new Node();
$g = new Node();
$h = new Node();
$i = new Node();
$a->value = 'A';
$b->value = 'B';
$c->value = 'C';
$d->value = 'D';
$e->value = 'E';
$f->value = 'F';
$g->value = 'G';
$h->value = 'H';
$i->value = 'I';
$a->child_left = $b;
$a->child_right = $c;
$b->child_left = $d;
$b->child_right = $g;
$c->child_left = $e;
$c->child_right = $f;
$d->child_left = $h;
$d->child_right = $i;
//前序遍歷
Ergodic::preOrder($a); //結(jié)果是:A B D H I G C E F
echo '<br/>';
//中序遍歷
Ergodic::midOrder($a); //結(jié)果是: H D I B G A E C F
echo '<br/>';
//后序遍歷
Ergodic::endOrder($a); //結(jié)果是: H I D G B E F C A
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP編程計(jì)算兩個(gè)時(shí)間段是否有交集的實(shí)現(xiàn)方法(不算邊界重疊)
這篇文章主要介紹了PHP編程計(jì)算兩個(gè)時(shí)間段是否有交集的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式對(duì)比分析了php時(shí)間段的轉(zhuǎn)換、比較等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
php實(shí)現(xiàn)curl模擬ftp上傳的方法
這篇文章主要介紹了php實(shí)現(xiàn)curl模擬ftp上傳的方法,實(shí)例分析了php基于curl實(shí)現(xiàn)FTP傳輸文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
php 截取GBK文檔某個(gè)位置開始的n個(gè)字符方法
下面小編就為大家?guī)硪黄猵hp 截取GBK文檔某個(gè)位置開始的n個(gè)字符方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
PHP的命令行擴(kuò)展Readline相關(guān)函數(shù)的使用
PHP 作為一個(gè) Web 開發(fā)語言,相對(duì)來說,命令行程序并不是它的主戰(zhàn)場。所以很多年輕的 PHP 開發(fā)者可能連命令行腳本都沒有寫過,更別提交互式的命令操作了。而今天,我們帶來的這個(gè)擴(kuò)展就是針對(duì) PHP 的交互式命令行操作的2021-05-05
PHP實(shí)現(xiàn)數(shù)組遞歸轉(zhuǎn)義的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)組遞歸轉(zhuǎn)義的方法,包含了數(shù)組的遞歸調(diào)用與字符串的轉(zhuǎn)義方法,需要的朋友可以參考下2014-08-08
echo, print, printf 和 sprintf 區(qū)別
echo, print, printf 和 sprintf 區(qū)別...2006-12-12
php通過exif_read_data函數(shù)獲取圖片的exif信息
這篇文章主要介紹了php通過exif_read_data函數(shù)獲取圖片的exif信息,默認(rèn)情況下,PHP讀取圖片Exif信息模塊是不開啟的,我們需要先開啟這個(gè)模塊。開啟Exif模塊需要mbstring支持,這里就不詳細(xì)說明了,我們來先看下函數(shù)的用法2015-05-05

