这个很简单 class node{ public var $per; public var $lNode; public var $rNode; function test1(){ } function test2(){ } } 由于php是弱类型语言,你只要清楚$lNode和$rNode的类型是node,赋值时一定要把node类型的左右节点赋给对应的就可以了。 $node0=new node(); $node0->per = 49; $node1=new node(); $node1->per = 20; $node2=new node(); $node2->per = 29; $node0->lNode = $node1; $node0->rNode = $node2;
class node{
public var $per;
public var $lNode;
public var $rNode; function test1(){
} function test2(){
}
}
由于php是弱类型语言,你只要清楚$lNode和$rNode的类型是node,赋值时一定要把node类型的左右节点赋给对应的就可以了。
$node0=new node();
$node0->per = 49;
$node1=new node();
$node1->per = 20;
$node2=new node();
$node2->per = 29;
$node0->lNode = $node1;
$node0->rNode = $node2;
<?php
$s = '4 6 8 9 10 12';
foreach(explode(' ', $s) as $k=>$v) { //初始化
$t[] = array('w' => $v, 'v' => $v); //用值作为权重
}
HuffmanTree($t);
echo DLR($t), PHP_EOL;/* 哈夫曼算法 */
function HuffmanTree(&$F) {
while(count($F) > 1) {
$r = array();
foreach($F as $item) $r[] = $item['w'];
array_multisort($r, $F);
$t = array('w' => $F[0]['w']+$F[1]['w'], 'l' => $F[0], 'r' => $F[1]);
unset($F[0]);
unset($F[1]);
$F[] = $t;
}
$F = current($F);
}
/* 前序遍历 */
function DLR($F, $deep=0) {
echo str_repeat(" ", $deep) .'+- ' . $F['w'] . PHP_EOL;//打印权重
if(isset($F['l'])) DLR($F['l'], $deep+1);
if(isset($F['r'])) DLR($F['r'], $deep+1);
}
+- 49
+- 20
+- 10
+- 10
+- 4
+- 6
+- 29
+- 12
+- 17
+- 8
+- 9
然后我看了你写的这个算法觉得你这个实现的很巧妙,尤其是array_multisort($r, $F);这个的运用,但是我对这个函数还不太熟悉,我想问的就是如果后面那个$F内部的值有字符的话,那它的排序方式会不会不同了些?还是只要$F这个数组的索引是数字索引那它的排序方式就不会变?
再一个就是我自己打过一遍你这个代码之后发现是不是我这种构建二叉树是没意义的?因为要是我想要在这里找一个数的话必须的遍历整棵树啊?而且用数组构建树想要往树里插入什么的都特别麻烦,所以我想用php模拟c++中的结构体然后用链表的方式来存储树,这样就不会把本来六个字符存成那么多,只存储给定的六个字符就可以,而且还符合头结点左边的值都小于头结点,右边的值都大于头结点,下面的子节点也是这个规则,那这样查找的时候不是更方便。
所以希望版主能给个思路或者再给段代码 O(∩_∩)O谢谢
class TNode{
public $LChild = null;//左孩子
public $RChild = null;//右孩子
public $Data = null;//数据
public function __construct( $data ){
$this->Data = $data;
}
}
版主,看你的啦