zoukankan      html  css  js  c++  java
  • php实现先序、中序、后序遍历二叉树

    二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆

     1 <?php
     2 class Node{
     3     public $value;
     4     public $left;
     5     public $right;
     6 }
     7 //先序遍历 根节点 ---> 左子树 ---> 右子树
     8 function preorder($root){
     9     $stack=array();
    10     array_push($stack,$root);
    11     while(!empty($stack)){
    12         $center_node=array_pop($stack);
    13         echo $center_node->value.' ';//先输出根节点
    14         if($center_node->right!=null){
    15             array_push($stack,$center_node->right);//压入左子树
    16         }
    17         if($center_node->left!=null){
    18             array_push($stack,$center_node->left);
    19         }
    20     }
    21 }
    22 //中序遍历,左子树---> 根节点 ---> 右子树
    23 function inorder($root){
    24     $stack = array();
    25     $center_node = $root;
    26     while (!empty($stack) || $center_node != null) {
    27              while ($center_node != null) {
    28                  array_push($stack, $center_node);
    29                  $center_node = $center_node->left;
    30              }
    31  
    32              $center_node = array_pop($stack);
    33              echo $center_node->value . " ";
    34  
    35              $center_node = $center_node->right;
    36          }
    37 }
    38 //后序遍历,左子树 ---> 右子树 ---> 根节点
    39 function tailorder($root){
    40     $stack=array();
    41     $outstack=array();
    42     array_push($stack,$root);
    43     while(!empty($stack)){
    44         $center_node=array_pop($stack);
    45         array_push($outstack,$center_node);//最先压入根节点,最后输出
    46         if($center_node->left!=null){
    47             array_push($stack,$center_node->left);
    48         }
    49         if($center_node->right!=null){
    50             array_push($stack,$center_node->right);
    51         }
    52     }
    53     
    54     while(!empty($outstack)){
    55         $center_node=array_pop($outstack);
    56         echo $center_node->value.' ';
    57     }
    58     
    59 }
    60 $a=new Node();
    61 $b=new Node();
    62 $c=new Node();
    63 $d=new Node();
    64 $e=new Node();
    65 $f=new Node();
    66 $a->value='A';
    67 $b->value='B';
    68 $c->value='C';
    69 $d->value='D';
    70 $e->value='E';
    71 $f->value='F';
    72 $a->left=$b;
    73 $a->right=$c;
    74 $b->left=$d;
    75 $c->left=$e;
    76 $c->right=$f;
    77 preorder($a);//A B D C E F 
    78 echo '<hr/>';
    79 inorder($a);//D B A E C F
    80 echo '<hr/>';
    81 tailorder($a);//D B E F C A

    结果:

    A B D C E F


    D B A E C F


    D B E F C A

     

  • 相关阅读:
    asp.net 发送邮件
    效控制C#中label输出文字的长度,自动换行
    无法连接到WMI 提供程序 请注意,你只能使用SQL Server 配置管理器来管理SQL Server 2005服务器。找不到指定的模块。[0x8007007e]
    查询区分大小写
    ASP.NET母版页引用外部css和js文件的写法
    VS2008 Debugging Breakpoint 补丁
    firefox下获得焦点
    IE打开出现windows找不到文件'(null)'解决方法Vinzipblog文之巴博客
    邪恶的web上下键焦点移动
    jQuery对下拉框Select操作总结
  • 原文地址:https://www.cnblogs.com/saonian/p/8296123.html
Copyright © 2011-2022 走看看