在学习图之前,中间休息了两天,感觉二叉树需要消化一下。所以中间去温习了下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

php 二叉树 与赫夫曼树相关推荐

  1. 由二叉树构造赫夫曼树

    赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有 n个叶子节点的二叉树,每个叶子节点带权为wi,则其中 带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假 ...

  2. 简述最优二叉树(赫夫曼树)

    什么是哈夫曼树: 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权 ...

  3. 6.6.1最优二叉树(赫夫曼树)

    首先我们来看一个伪代码.这个是代表成绩的等级. 然后我们知道,每一次高考,学生的成绩分布应该接近某个比例,现在我们假如分别规律如下: 为此可以作出下面的这个树. 我们发现,概率分布主要是在70-79, ...

  4. 赫夫曼树的定义及原理

    参考<大话数据结构>        以学生成绩为例进行分析,正常的学生成绩的分布范围如下: 下面的图是普通的学生成绩判断,粗略的看什么问题,可是通常都认为,一张好的考卷应该是让学生的成绩大 ...

  5. 赫夫曼树(Haffman)及其运用

    赫夫曼树,别名"哈夫曼树"."最优树"以及"最优二叉树". 概念: 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径. (从根结点 ...

  6. 数据结构-赫夫曼树(三)

    Huffman Tree 哈夫曼树 霍夫曼树 概念 代码实现: 概念 路径和路径长度: 路径: 从一个节点往下可以达到的子节点或子子节点之间的通路 路径长度: 通路中分支的数目称之为路径长度. 根节点 ...

  7. 赫夫曼树及求解最小WPL的实现

    赫夫曼树 定义: 假设有m个权值{W1,W2,...Wm},可以构造一颗含有n个叶子节点的二叉树,每个叶子节点的权为Wj,则其中树的带权路径长度即WPL最小的二叉树称作最优二叉树或赫夫曼树. 算法思想 ...

  8. 赫夫曼树+赫夫曼编码小结

    赫夫曼树 赫夫曼树定义与原理 从树中一个节点到另一个节点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度. 图6-12-4的二叉树a中,根结点到结点D的路径长度就为4,二叉树b中根结点到 ...

  9. 数据结构(十五)— 树结构之赫夫曼树及其应用

    现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好.在计算机和互联网技术中,文本压缩就是一个非常重要的技术. 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档. ...

最新文章

  1. 某程序员为让公司裁掉自己,消极怠工!故意旷工!但公司坚持不裁他,领导:给你发工资,就是不裁你!...
  2. Top K算法问题的实现
  3. visual 对话框之间调用_两套S71200之间实现S7通讯的方法
  4. ASP.NET几种安全验证方法(一)
  5. 解决Ubuntu18.04没有声音(简便且终极方法)
  6. Java面试之什么是GCRoots,能做什么?
  7. 【论文笔记】Revisiting Graph based Collaborative Filtering: A Linear Residual Graph Convolutional Network
  8. busybox inetd tftpd
  9. Flutter 进阶系列篇
  10. 【系统架构】ER图的画图规范和优化点
  11. 专升本高数第一章试题_专升本高数复习资料,精品系列
  12. 翻译软件-好用的翻译软件-免费翻译软件大全
  13. 计算机ms高级应用科目一 科目二考什么,科目一、科目二、科目三、科目四都考什么?全都在这儿了!...
  14. 【PHP面试题】请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句如何分析?
  15. 你天天努力的碎片化学习,为什么还在每天挤地铁?
  16. Clock skew too great(37)-PREAUTH_FAILED
  17. 高德地图地理编码和逆地理编码,以及逆地理编码的时候如何去掉省、市、镇
  18. C语言用链表实现管理系统
  19. linux怎么看go写的程序进程,Linux中查看进程状态信息-Go语言中文社区
  20. Altium Designer 21的使用(四):排针类元件模型的创建

热门文章

  1. postgresql 集群_谁说postgresql 没有靠谱的高可用(2)
  2. FTP搭建网络yum源
  3. 没有form的表单验证_PHP动态生成表单,内置17种常用组件并且支持表单验证!
  4. safari浏览器横屏怎么设置_Safari浏览器的几个小技巧你掌握了吗?
  5. c语言用正数的形式求最大值最小值,C语言-进制 - 盘盘的灰灰的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. Linux基础之网络配置
  7. python集合属性方法运算_Python基础__字典、集合、运算符
  8. C语言变参函数的实现,C语言的那些小秘密之变参函数的实现
  9. sklearn查看版本 windows_解密windows系统版本和版本号,深入了解一组简单数字背后的故事...
  10. 虚拟机增强工具的安装