1. 程式人生 > >PHP遍歷二叉樹

PHP遍歷二叉樹

技術 () binary 原則 null 深度 壓入 com right

遍歷二叉樹,這個相對比較復雜。

二叉樹的便利,主要有兩種,一種是廣度優先遍歷,一種是深度優先遍歷。

什麽是廣度優先遍歷?就是根節點進入,水平一行一行的便利。

什麽是深度優先遍歷呢?就是根節點進入,然後按照一個固定的規律,一直向下走,一個方向的子樹遍歷之後再遍歷另一個方向的子樹。

深度優先遍歷,主要有三種順序遍歷:先序(先輸出根節點),中序(第二個輸出根節點),後序(最後輸出根節點)。

直接上代碼吧。

 1 class Node {
 2     public $data = null;
 3     public $left = null;
 4     public
$right = null; 5 } 6 7 $node1 = new Node(); 8 $node2 = new Node(); 9 $node3 = new Node(); 10 $node4 = new Node(); 11 $node5 = new Node(); 12 $node6 = new Node(); 13 $node7 = new Node(); 14 $node8 = new Node(); 15 $node9 = new Node(); 16 17 $node1->data = 1; 18 $node2->data = 2;
19 $node3->data = 3; 20 $node4->data = 4; 21 $node5->data = 5; 22 $node6->data = 6; 23 $node7->data = 7; 24 $node8->data = 8; 25 $node9->data = 9; 26 27 $node1->left = $node2; 28 $node1->right = $node3; 29 $node2->left = $node4; 30 $node2->right = $node5;
31 $node3->left = $node6; 32 $node3->right = $node7; 33 $node4->left = $node8; 34 $node4->right = $node9;

以上代碼,簡單建立一個二叉樹,如下圖:

技術分享圖片

廣度優先遍歷

 1 // 二叉樹廣度優先遍歷
 2 function binary_tree1($node) {
 3     $result = [];//保存結果
 4     $memc = [];
 5     array_push($memc, $node);//根節點入隊
 6     while (!empty($memc)) {//持續輸出節點,直到隊列為空
 7         $cnode = array_shift($memc);//最前邊的元素出隊
 8         $result[] = $cnode->data;//記錄當前節點的值
 9         //左節點先入隊,然後右節點入隊
10         if ($cnode->left != null) 
11             array_push($memc, $cnode->left);
12         if ($cnode->right != null) 
13             array_push($memc, $cnode->right);
14     }
15     return $result;
16 }
17 
18 print_r(binary_tree2($node1));

深度優先遍歷(先序)

 1 // 二叉樹深度優先遍歷(先序)
 2 function binary_tree2($node)
 3 {
 4     $result = [];//結果數組
 5     $memc  = [];
 6     array_push($memc, $node);//將根節點壓棧
 7     while (!empty($memc)) {
 8         $cnode = array_pop($memc);//彈出剛剛壓棧的節點
 9         $result[] = $cnode->data;
10         //因為先進後出原則,想先顯示左子樹,所以先壓入右子樹
11         if ($cnode->right != null) {
12             array_push($memc, $cnode->right);
13         }
14         if ($cnode->left != null) {
15             array_push($memc, $cnode->left);
16         }
17     }
18     return $result;
19 }
20 
21 print_r(binary_tree2($node1));

PHP遍歷二叉樹