本文實例講述了PHP基于非遞歸算法實現先序、中序及后序遍歷二叉樹操作。分享給大家供大家參考,具體如下:
概述:
二叉樹遍歷原理如下:
針對上圖所示二叉樹遍歷:
1. 前序遍歷:先遍歷根結點,然后遍歷左子樹,最后遍歷右子樹。
ABDHECFG
2.中序遍歷:先遍歷左子樹,然后遍歷根結點,最后遍歷右子樹。
HDBEAFCG
3.后序遍歷:先遍歷左子樹,然后遍歷右子樹,最后遍歷根節點。
HDEBFGCA
實現方法:
先序遍歷:利用棧先進后出的特性,先訪問根節點,再把右子樹壓入,再壓入左子樹。這樣取出的時候是先取出左子樹,最后取出右子樹。
- function preorder($root){
- $stack = array();
- array_push($stack, $root);
- while(!empty($stack)){
- $center_node = array_pop($stack);
- echo $center_node->value; // 根節點
- if($center_node->right != null)
- array_push($stack, $center_node->right); // 壓入右子樹
- if($center_node->left != null)
- array_push($stack, $center_node->left); // 壓入左子樹
- }
- }
中序:需要從下向上遍歷,所以先把左子樹壓入棧,然后逐個訪問根節點和右子樹。
- function inorder($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->left;
- }
- $center_node = array_pop($stack);
- echo $center_node->value;
- $center_node = $center_node->right;
- }
- }
后序:先把根節點存起來,然后依次儲存左子樹和右子樹。然后輸出。
- function tailorder($root){
- $stack = array();
- $outstack = array();
- array_push($$stack, $root);
- while($empty($stack)){
- $center_node = array_pop($stack);
- array_push($outstack, $center_node);
- if($center_node->right != null)
- array_push($stack, $center_node->right);
- if($center_node->left != null)
- array_push($stack, $center_node->left);
- }
- while($empty($outstack)){
- $center_node = array_pop($outstack);
- echo $center_node->value;
- }
- }
希望本文所述對大家PHP程序設計有所幫助。