法需要进行比较大的改进才能适应,而递归的方法则应用自如,所以在这种情况下,递归的适应性较强。这是当然的了,因为递归的方法就是链表的一种形式,树、图都可以用链表来表达,当然适应力强了。
5、直观,如果不用程序操作,直接观察数据库中存储的数据的话,显然递归方式下存储的数据比较直观,而预排序树的数据很难直接阅读(针对层次关系来说),这在数据交换中是不是会有影响呢?
总体来说,我个人比较喜欢用递归的方法,但一直担心递归对效率的影响,所幸还没有接触过规模较大的分类层次,递归用数组替代堆栈会是一种比较好的改进方法。而预排序树不失为一种解决简单树的高效方法,用习惯了,也应该是非常出色的,尤其是它从叶子节点到根节点的反向查找非常方便。
Fwolf www.fwolf.com » reply to this comment 非常高兴看到你的回复 Posted by shuke on 2004, March 18 - 5:47am. 非常高兴你这么认真的读完这篇文章。这篇文章其实是原来发表在sitepoint.com上的,我把它翻译了一下,希望给希望初学入门的朋友介绍一些方法,抛砖引玉。你的方法也很好,有机会我会试一下的。(如果你有兴趣的话,何不就上面的例子把你的方法和具体实现的代码也写成教程发出来吧,这样大家就用更加实际的例子来模仿了)如果你对数据库中保存多级结构有兴趣研究的话,这里还有两个连接也很不错可以作为参考: 介绍了常见的4中方法 一次查询,数组排序的脚本我想你的脚本肯定比这个强。 另外我看到你也用drupal,它还有一个高级功能叫分布式用户验证系统,只要在任何一个drupal的站点注册以后就可以登录访问其它的drupal站点了。挺有意思的。 祝好! » reply to this comment 用循环来建树已经实现了 Posted by 访客 on 2004, March 25 - 10:10pm. 你上次提供的资料我已经都看过了,不过老实说,第一篇文章里没有太多新东西,或许是我没看太明白吧,第二个居然是PHP3写的,程序结构没有细看,用到太多的函数交叉。 正好我在一个系统中用户角色要用到分级,按照数组的思路就把遍历写了下来,没有时间整理,先放到这里你看看吧,数据库用的是ADODB,程序是直接从系统中摘出来的,希望能够描述得清楚,主要是利用了PHP强大的数组操作,用循环来进行递归。注释里是一种相近的方法,只是处理结果的时机不同而已。
<?php /** * 显示列表 * @access public */ function DispList() { //不缩进的显示方式 // $this->mIsDispListIndex = true; // echo(''<p align="right"><a href="?action=new&part=role">增加新角色</a> </p>''); _fcksavedurl=""?action=new&part=role">增加新角色</a> </p>'');" // // $this->mListTitle = "用户角色列表"; // $this->SetDataOption(''list''); // // $this->SetQueryTable( array($this->mTableUserRole) ); // // //查询顺序 // $this->SetQueryOrder( ''asc'', $this->mTableUserRole, ''sequence'' ); // // $this->Query(''list''); // parent::DispList();
// //另外一种显示方式,用数组作为堆栈,A: 压栈时存role,压完就删除source // $this->CheckProperty(''mrDb''); // $this->CheckProperty(''mrSql''); // $this->mrSql->Select(''role, title, parent''); // $this->mrSql->From($this->mTableUserRole); // $this->mrSql->Orderby(''parent, sequence''); // $this->mRs = $this->mrDb->Execute($this->mrSql->Sql()); // if (0 < count($this->mRs)) // { // $source = & $this->mRs->GetArray(); //数字索引 // $stack = array(''''); / |