php 二叉树 与赫夫曼树

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

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

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. 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. 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. 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. //我个人还是挺喜欢层序遍历
    	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);
    		}
    	}

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

愿法界众生,皆得安乐。

时间: 2024-08-24 04:41:58

php 二叉树 与赫夫曼树的相关文章

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

数据结构之二叉树,赫夫曼树(C++版)

#include <iostream>#include <windows.h>#include <stdlib.h>#include <string.h>#define MAXLISTSIZE 100 //预设的存储空间最大容量#define FALSE 0#define TRUE 1using namespace std;typedef char ElemType; typedef struct BiTNode{ ElemType data; struct

13.赫夫曼树及其应用

一.赫夫曼树定义与原理 1.路径长度:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度; 2.树的路径长度:即从树根到每一结点的路径长度之和; 3.结点的带权的路径长度:即从该结点从到树根之间的路径长度与结点上权的乘积; 4.树的带权路径长度:为树中所有叶子结点的带权路径长度之和; 5.赫夫曼树定义:假设有n个权值{w1,w2,....,wn},构造一颗有n个叶子结点的二叉树,每个叶子结点带权wk,每个叶子的路径长度为lk,则其中带权路径长度WPL最小的

赫夫曼树

一.前言 赫夫曼树,又称最优树,是一类带权路径长度最短的树. 二.基础知识 1.路径长度:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上分支数目称为路径长度. 2.树的路径长度:是从树根到每一个结点的路径长度之和.完全二叉树就是路径长度最短的二叉树. 3.树带权路径长度:为树中所有叶子结点的带权路径长度之和(记做WPL). 4.最优二叉树或者赫夫曼树:假设有n个权值(w1,w2,w3,w4,,,,,,wn).试构造一棵有n个叶子结点的二叉树,每个叶子结点带权为wi,其中称带

《大话数据结构》笔记(6-3)--树:赫夫曼树

代码实现: 第六章    树:赫夫曼树 赫夫曼树定义与原理 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度. 树的路径长度就是从树根到每一结点的路径长度之和. 对于带权的结点,结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积. 树的带权路径长度为树中所有叶子结点的带权路径长度之和. 假设有n个权值{w1, w2, ..., wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权wk ,每个叶子的路径长度为lk,则其中带权路径长度WPL最

使用优先队列构建赫夫曼树

关于赫夫曼编码和赫夫曼树的相关知识可参考之前两篇文章(由二叉树构造赫夫曼树.赫夫曼编码).本文介绍另一种构建赫夫曼树的方式,采用优先队列. 步骤: 1.首先我们需要统计不同字符出现的次数.一个字符出现的次数越多,说明其优先级越高,其赫夫曼编码应该越短: 2.将待编码的字符(即带权节点)存入优先级队列,优先级即字符出现的次数: 3.不断迭代队列,直到队列中剩下一个元素(即根节点).每次从队列中取出两个优先级最小的元素(优先级队列中的元素是按照节点优先级顺序排列的),然后生成一个新的赫夫曼树节点,节

有趣的赫夫曼树

美国有个数学家叫赫夫曼,60年前他根据数据的使用概率,发明了一个二叉树叫赫夫曼树. 这个赫夫曼树被用在了数据压缩上,被称为赫夫曼编码,这是后来压缩的基础. 他解决的问题主要思想是:根据元素出现的概率,获得最优解. 举例如下: 学生考试成绩出来后,会根据考试成绩分等级,极优秀,优秀,中等,及格,不及格.如果我们按照普通逻辑进行判断时,通常是: if (Score < 60) { printf("不及格"); } else if (Score < 70) { printf(&q

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做