PHP遍歷二叉樹
阿新 • • 發佈:2019-01-23
技術 () 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遍歷二叉樹