• PHP遍历二叉树


    遍历二叉树,这个相对比较复杂。

    二叉树的便利,主要有两种,一种是广度优先遍历,一种是深度优先遍历。

    什么是广度优先遍历?就是根节点进入,水平一行一行的便利。

    什么是深度优先遍历呢?就是根节点进入,然后按照一个固定的规律,一直向下走,一个方向的子树遍历之后再遍历另一个方向的子树。

    深度优先遍历,主要有三种顺序遍历:先序(先输出根节点),中序(第二个输出根节点),后序(最后输出根节点)。

    直接上代码吧。

     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));
  • 相关阅读:
    elasticsearch的cross_fields查询
    搭建elk集群 disabled in libcurl elasticsearch-6.2.2 更新license 版本
    elastic mapping not_analyzed 简单理解 + analysis-ik分词器安装
    ElasticsearchException: java.io.IOException: failed to read [id:0, file:/data/elasticsearch/nodes/0/_state/global-0.st]
    elastic 查询案例Query与Filter + 增删改查简单理解 + dynamic mapping + keyword
    kibana 查询例子
    用grok拆分java日志
    logstash 处理信息规律研究
    docker-compose 部署elk+解决时间不对导致kibana找不到logstash定义的index + docker-compose安装
    JavaScript(6):Number对象
  • 原文地址:https://www.cnblogs.com/leafinwind/p/10306553.html
Copyright © 2020-2023  润新知