上一篇博客已經介紹了二叉樹的前序,中序,後序 ,以及層次遍歷(遞歸和非遞歸)的實現思路,接下來,採用php 語言 具體實現
一、、先序(跟--左---右)
<?php
class Node{
public $data;
public $left;
public $right;
}
(1) //先序--遞歸方式實現。
function preOrder($tree){
echo($tree->data);
if($tree->left!=null){
preOrder($tree->left);
}
if($tree->right!=null){
preOrder($tree->right);
}
}
(2 非遞歸方式) function preOrderNotRecrusive($tree){
//前序遍歷:先訪問根節點,再遍歷左子樹,最後遍歷右子樹;並且在遍歷左右子樹時,仍需先遍歷根節點,然後訪問左子樹,最後遍歷右子樹
array_push($arr_stack,$tree);
while(!empty($arr_stack)){
$center_node=array_pop($arr_stack);
echo $center_node->data.' ';
if($center_node->right!=null){
array_push($arr_stack,$center_node->right);
}
if($center_node->left!=null){
array_push($arr_stack,$center_node->left);
}
}
}
二 、中序實現(左-跟-右)(DEBAFCG)
1、遞歸方式
function centerRecrusiveOrder($tree){
if($tree->left!=null){
centerRecrusiveOrder($tree->left);
}
echo($tree->data);
if($tree->right!=null){
centerRecrusiveOrder($tree->right);
}
}
2、非遞歸方式
//中序遍歷:先遍歷左子樹、然後訪問根節點,最後遍歷右子樹;並且在遍歷左右子樹的時候。仍然是先遍歷左子樹,然後訪問根節點,最後遍歷右子樹
function centerOrderNotRecrusive($tree){
$arr_stack=array();
while(!empty($arr_stack)||$tree!=null){
while($tree!=null){
array_push($arr_stack,$tree);
$tree=$tree->left;
}
$tree=array_pop($arr_stack);
echo $tree->data.' ';
$tree=$tree->right;
}
}
三、後序遍歷方式(左-右-跟)
1、遞歸方式(DEBFGCA)
function lastRecrusiveOrder($tree){
if($tree->left!=null){
lastRecrusiveOrder($tree->left);
}
if($tree->right!=null){
lastRecrusiveOrder($tree->right);
}
echo($tree->data);
}
}
2、非遞歸方式
//後序遍歷:先遍歷左子樹,然後遍歷右子樹,最後訪問根節點;同樣,在遍歷左右子樹的時候同樣要先遍歷左子樹,然後遍歷右子樹,最後訪問根節點
function lastOrderNotRecursive($tree){
$push_stack = array();
$visit_stack = array();
array_push($push_stack, $tree);
while (!empty($push_stack)) {
$center_node = array_pop($push_stack);
array_push($visit_stack, $center_node);
//左子樹節點先入$pushstack的棧,確保在$visitstack中先出棧
if ($center_node->left != null) array_push($push_stack, $center_node->left);
if ($center_node->right != null) array_push($push_stack, $center_node->right);
}
while (!empty($visit_stack)) {
$center_node = array_pop($visit_stack);
echo $center_node->data. ' ';
}
}
四、層次遍歷
function breath_order($tree){
$traverse_data = array();
$queue = array();
array_unshift($queue, $tree); #根節點入隊
while (!empty($queue)) { #持續輸出節點,直到隊列爲空
$cnode = array_pop($queue); #隊尾元素出隊
echo $cnode->data.' ';
$traverse_data[] = $cnode->data;
#左節點先入隊,然後右節點入隊
if ($cnode->left != null) array_unshift($queue, $cnode->left);
if ($cnode->right != null) array_unshift($queue, $cnode->right);
}
二叉樹的層次遍歷思路,藉助隊列來實現。相當於廣度優先搜索,使用隊列(深度優先搜索的話,使用棧)。
若根節點爲空,直接返回;
若根節點非空,則將根節點入隊,然後,判斷隊列是否爲空,若不爲空,則將隊首節點出隊,訪問,並判斷其左右子節點是否爲空,若不爲空,則壓入隊列。
$b=new Node();
$c=new Node();
$d=new Node();
$f=new Node();
$g =new Node();
$tree->data='A';
$b->data='B';
$c->data='C';
$d->data='D';
$e->data='E';
$f->data='F';
$g->data='G';
$tree->left=$b;
$tree->right=$c;
$b->left=$d;
$b->right=$e;
$c->left=$f;
$c->right=$g;
preOrder($tree);
?>