php 二叉树 与赫夫曼树

简介:

在学习图之前,中间休息了两天,感觉二叉树需要消化一下。所以中间去温习了下sql,推荐一本工具书《程序员的SQL金典》看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下。涵盖内容不详细但是挺广,覆盖多种主流数据库


言归正传,以前知道折半查找,二叉树的概念也是感觉挺有意思,二叉树的实现有一个案例很不错,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class  BiNode{
     public  $data ;
     public  $lchild ;
     public  $rchild ;
     public  function  __construct( $data ){
             $this ->data =  $data ; //节点数据
             $this ->lchild = null; //左子节点指针
             $this ->rchild = null; //右指针
     }
}
class  LinkBiTree{
     private  $root //根节点
         private  static  $count ;     //结点总数
     const  MAX_LEVEL = 2;
     
     public  function  __construct(){
         $this ->root = null;
         self:: $count  = 0;
     }
 
     public  function  ClearBiTree(){
         $this ->clearTree( $this ->root);
     }
 
     /**
     *@param $root 树的根节点
     *
     */
 
     public  function  clearTree( $root ){
         if ( $root ){
             if ( $root ->lchild){
                 $this ->clearTree( $root ->lchild);
             }
             if ( $root ->rchild){
                 $this ->clearTree( $root ->rchild);
             }
             unset( $root );
             $root =null;
         }
     }
     
     
}  

其实我更加感兴趣的就是赫夫曼树,能够给我带来感觉得才让我激动,就是100以内猜七次肯定可以猜出来,这种感觉是很奇妙的,当年赫夫曼为了传输点卯,更改了数据的排列顺序,形成了新的储存序列和标识,是的竟成使用的字母快速找出来,节省了资源,很棒。


赫尔曼构造算法的实现

初始化HT

输入初始n个叶子结点:置HT[1…n]的weight值

然后根据权值来重新安排叶子结点,可以先序可以中序可以后续也可以中序,只要距离根节点的搜索顺序在前面就好

  1. 先序递归实现如下


  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public  function  PreOrderTraverse(){
    $this ->preTraverse( $this ->root);
    return  self:: $preArr ;
    }
    //还是递归调用,不对,
    private  function  preTraverse(){
    if ( $root ){
    self:: $preArr []= $root ->data;
    //这里可以把数据都存进去也可以做其他操作或者业务逻辑function()
    $this ->preTraverse( $root ->lchild);
    $this ->preTraverse( $root ->rchild);
    }
    }
  3. 中序递归实现如下

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public  function  InOrderTraverse(){
    $this ->inTraverse( $this ->root);
    return  self:: $inArr ;
    }
    private  function  inTraverse(){
    if ( $root ){
    $this ->inTraverse( $root ->lchild);
    self:: $inArr []= $root ->data;
    //这里可以把数据都存进去也可以做其他操作或者业务逻辑function()
    $this ->inTraverse( $root ->rchild);
    }
    }
  5. 后续递归实现如下

  6. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public  function  PostOrderTraverse(){
             $this ->postTraverse( $this ->root);
             return  self:: $postArr ;
         }
         private  function  postTraverse(){
             if ( $root ){
                 $this ->postTraverse( $root ->lchild);
                 self:: $postArr []= $root ->data;
                 //这里可以把数据都存进去也可以做其他操作或者业务逻辑function()
                 
                 $this ->postTraverse( $root ->rchild);
             }
         }
  7. 层序递归实现如下

  8. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //我个人还是挺喜欢层序遍历
         public  function  LevelOrderTraverse(){
             for ( $i =1; $i <= $this ->BiTreeDepth(); $i ++){
                 $this ->LevelOrderTraverse( $this ->root, $i );
             }
             return  self:: $levelArr ;
         }
         private  function  leverTraverse( $root , $level ){
             if ( $root ){
                 if ( $level ==1){
                     self:: $levelArr []= $root ->data;
                 }
                 $this ->LevelOrderTraverse( $root ->lchild, $level -1);
                 $this ->LevelOrderTraverse( $root ->rchild, $level -1);
             }
         }

记录一下。其实有时候在想,写程序的同事,真的要做点其他的。但行好事,莫问前程


愿法界众生,皆得安乐。


本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1951446


相关文章
|
8月前
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
82 0
|
8月前
|
关系型数据库 MySQL 数据库连接
PHP 原生连接 Mysql
PHP 原生连接 Mysql
110 0
|
8月前
|
关系型数据库 MySQL Unix
PHP MySql 安装与连接
PHP MySql 安装与连接
137 0
|
4月前
|
关系型数据库 MySQL PHP
|
13天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
28天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
8月前
|
关系型数据库 MySQL 数据库连接
PHP 原生操作 Mysql 增删改查案例
PHP 原生操作 Mysql 增删改查案例
88 0
|
3月前
|
监控 关系型数据库 MySQL
PHP与MySQL的结合:实现局域网上网行为监控软件的数据库管理
在当今信息化时代,网络安全日益成为重要的话题。为了有效监控和管理局域网上网行为,开发一个基于PHP和MySQL的数据库管理系统是一个理想的选择。本文将介绍如何结合PHP和MySQL,开发一款简单而高效的局域网上网行为监控软件,并重点关注数据库管理方面的实现。
200 0
|
9月前
|
运维 关系型数据库 MySQL
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)(二)
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)(二)
203 0