php實現二叉樹的前序,中序,後序,和層次遍歷

    上一篇博客已經介紹了二叉樹的前序,中序,後序  ,以及層次遍歷(遞歸和非遞歸)的實現思路,接下來,採用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){

 //前序遍歷:先訪問根節點,再遍歷左子樹,最後遍歷右子樹;並且在遍歷左右子樹時,仍需先遍歷根節點,然後訪問左子樹,最後遍歷右子樹 

        $arr_stack=array();
        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);

 }

二叉樹的層次遍歷思路,藉助隊列來實現。相當於廣度優先搜索,使用隊列(深度優先搜索的話,使用棧)。


若根節點爲空,直接返回;

若根節點非空,則將根節點入隊,然後,判斷隊列是否爲空,若不爲空,則將隊首節點出隊,訪問,並判斷其左右子節點是否爲空,若不爲空,則壓入隊列。


    $tree=new Node();
   
    $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);
    




?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章