• PHP 二叉树的深度优先与广度优先遍历


     1 <?php
     2      #二叉树的广度优先遍历
     3      #使用一个队列实现
     4  
     5      class Node {
     6          public $data = null;
     7          public $left = null;
     8          public $right = null;
     9      }
    10  
    11      #@param $btree 二叉树根节点
    12      function breadth_first_traverse($btree) {
    13          $traverse_data = array();
    14          $queue = array();
    15          array_unshift($queue, $btree); #根节点入队
    16          
    17          while (!empty($queue)) { #持续输出节点,直到队列为空
    18              $cnode = array_pop($queue); #队尾元素出队
    19              $traverse_data[] = $cnode->data;
    20  
    21              #左节点先入队,然后右节点入队
    22              if ($cnode->left != null) array_unshift($queue, $cnode->left);
    23              if ($cnode->right != null) array_unshift($queue, $cnode->right);
    24          }
    25  
    26          return $traverse_data;
    27      }
    28 
    29      #深度优先遍历,使用一个栈实现
    30      function depth_first_traverse($btree) {
    31         $traverse_data = array();
    32         $stack = array();
    33         array_push($stack, $btree);
    34 
    35         while (!empty($stack)) {
    36             $cnode = array_pop($stack);
    37             $traverse_data[] = $cnode->data;
    38 
    39             if ($cnode->right != null) array_push($stack, $cnode->right);
    40             if ($cnode->left != null) array_push($stack, $cnode->left);
    41         }
    42 
    43         return $traverse_data;
    44      }
    45  
    46      $root = new Node();
    47      $node1 = new Node();
    48      $node2 = new Node();
    49      $node3 = new Node();
    50      $node4 = new Node();
    51      $node5 = new Node();
    52      $node6 = new Node();
    53  
    54      $root->data = 1;
    55      $node1->data = 2;
    56      $node2->data = 3;
    57      $node3->data = 4;
    58      $node4->data = 5;
    59      $node5->data = 6;
    60      $node6->data = 7;
    61  
    62      $root->left = $node1;
    63      $root->right = $node2;
    64      $node1->left = $node3;
    65      $node1->right = $node4;
    66      $node2->left = $node5;
    67      $node2->right = $node6;
    68  
    69      $traverse = breadth_first_traverse($root);
    70      print_r($traverse);
    71      echo "<br>";
    72      $traverse = depth_first_traverse($root);
    73      print_r($traverse);
    74  ?>

    Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 ) 
    Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 3 [5] => 6 [6] => 7 )

  • 相关阅读:
    (二)Knockout 文本与外观绑定
    Knockout案例: 全选
    (一)Knockout 计算属性
    打造Orm经典,创CRUD新时代,Orm的反攻战
    让我们开启数据库无Linq、零sql时代
    EF总结
    高性能Web系统设计方案(初稿目录),支持者进
    Bootstrap+angularjs+MVC3+分页技术+角色权限验证系统
    .NET 2.0 检测
    C# 用代码创建 DataSet 和 DataTable 的列和记录
  • 原文地址:https://www.cnblogs.com/zemliu/p/2700878.html
Copyright © 2020-2023  润新知