如何利用java递归遍历得到树

如何利用java递归遍历得到树,第1张

你这个是Oracle吧

父子节点是DEPTID和FDEPTID吧

Oracle里面有一条语句是专门用来处理树的,

selectstart with connect by prior

大概是 select from table start with DEPTID=1 connect by prior DEPTID=FDEPTID

我很久没用过Oracle了,可能上面这条sql是错的具体你参考一下网上的消息吧

要是oracle多好,一句话搞定。

既然是java,给你伪代码,你补充吧:

String getDeptName(int level,String dept){

if(level==0){

return dept;

}else if(level>=10){

return "层数太大";

}else{

return getDeptName(level-1,dept->childDeptName);

}

}

相信你知道level在递归查询中的意思,除了level之外,还有一个伪列:CONNECT_BY_ISLEAF。你可以在输出的列中间加上CONNECT_BY_ISLEAF这个列,将会发现CONNECT_BY_ISLEAF为1的全是叶子节点,也就是你说的最底层。

这种类型的数据,一般数据库中,一张表会有存在两个字段,一个是它本身id,另一个是它的父级parent_id。

既然要找到它的祖父级,sql语句这样写:

$id = empty($_POST['id'])'':$_POST['id'];

$parent_id = get_parent_id($id);

$p_p_id = get_parent_id($parent_id);

function get_parent_id($id){

$sql = "select parent_id from ecs_table1 where id=" $id;

return($GLOBALS['db']->getone($sql ));

}

递归,就是根据现有的id,重复取。

上面get_parent_id只是获取父id,当然,你可以写一个直接获取祖父id的函数。

不过,现在大部分php网站,都只会有获取父类的函数,想discuz,ecshop等。获取祖父id,就是不断的获取该id的父id。

同样的语法结构可以层层嵌套,同一条结构规则可以重复使用而不致造成结构上的混乱,借数学的术语来说,这就是语法结构规则的"递归性"。

在句法组合中,递归性有两种表现,一种是从初始结构开始,自始至终重复运用同一条语法规则。例如"计算机/我//喜欢"这个句子是主谓结构,它们的谓语( / 以后的部分)本身又是主谓结构,这里,"主语+谓语"这条语法规则不间断地使用了两次;另外一种表现是,同一条语法规则可以在一个结构上间隔地重复使用。

例如在"我/看///过//他/////写////的///散文"中,第一层使用了"主语+谓语"规则,造成了"我/看过他写的散文"这个主谓结构,第五层又使用了一次"主语+谓语"规则,造成了"他写"这个主谓结构。

语法规则的递归性和语法结构的层次性密切相关。语法结构的层次性在相当大的程度上是由递归性造成的,反过来讲,语法结构的层次性也为语法规则的反复使用提供了可能。

结构中某个单位(例如词)可以不断地被一个同功能的词组去替换,结果可以使基本结构里面的项扩展成层次非常复杂的结构,但作用仍等于原先的那个项。

比如"他喝了茶"是主谓结构,我们可以通过偏正结构的递归把其中的宾语"茶"扩展成"新茶"、"江南的新茶"、"刚沏的江南的新茶"、"太太刚沏的江南的新茶"、" 太太为他刚沏的江南的新茶"等等。

结构规则的递归从理论上讲可以是无穷尽的,上面的例子不管扩展到什么地步,它的作用还是等于"他喝了茶"里面的"茶"。

任何语言的语法规则都有递归性,因而语言才富有组合上的变化性、开放性和创造性,能随表达的需要而屈伸自如。语言如果没有这一特点,就无法让人类用有限的手段来表达无限的思想。

这个问题太宽泛,具体的还的看你的组织机构表的设计

目前常见的解决办法有如下方式

1、在表设计时候加入冗余字段,维护层级关系 ,如1234,通过模糊查询即可查询出全部的下级 like '1%'

2、通过递归的方式,2005 开始支持cte,

范例如下:

with FullPathBuilder as

(

select Name

,Id from orgTable b

where bParentId is null

union all

select bName ,bId

from orgTable b join FullPathBuilder on bparentId = FullPathBuilderId

)

select from FullPathBuilder

1、在修改和新增栏目成功的时候生成缓存文件,在模板中使用缓存

/更新缓存文件/

$map['topid'] = 0;

$map['yiyuanid'] = $this->_get('yiyuanid');

$other['order'] = 'sort desc,keshiid asc';

$other['field'] = 'keshi,yiyuanname as yiyuan';

$other['join'] = 'yiyuan on yiyuanid=keshiyiyuanid';

$digui = digui('keshi',$map,$other);

S('keshi',$digui);//缓存数据

2、核心的三个递归函数

/

递归数据,递归成多维数组,childs存储下级,生产环境中请把返回值进行缓存,这样只查库一次,可以在新增和更新的方法处再调用这个函数更新缓存

@param string $table 查询的表名

@param array $where 查询的where条件

@param array $other 其它查询需要的变量

@return array $list 一个表示层级关系的多维数组

/

function digui($table,$where,$other){

$Form = M($table);

if($other['join']){

$list = $Form->field($other['field'])->join($other['join'])->where($where)->order($other['order'])->select();

}else{

$list = $Form->field($other['field'])->where($where)->order($other['order'])->select();

}

foreach ($list as $k => $v) {

if($digui = digui($table,array('topid'=>$v['id']),$other)){

$list[$k]['childs'] = $digui;//递归子类

}

}

return $list;

}

/

读取递归数据的函数,使用前请把digui()函数的返回值进行缓存

@param array $list 这个参数是S('keshi')读取过来的层级关系的多维数组,是由digui()产生的

@return void 无返回值直接输出

/

function KeshiType($list){

foreach ($list as $k => $v) {

echo '<tr align="center" bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'$v['id']'</td><td width="14%">'$v['yiyuan']'</td><td width="14%">'$v['name']'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'\',\'id'$v['id']'\',1000,650)">编辑</span> <span alt="'$v['id']'" title="'$v['name']'" class="ksjb">编辑</span> <a href="/Yisheng/index/yiyuanid/'$v['yiyuanid']'/keshiid/'$v['id']'" class="coolbg">编辑</a> <a href="/Code/keshi_del/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'" class="coolbg">删除</a></td></tr>';

KeshiTypeSeed($v['childs']);

}

}

/

楼上KeshiType的子函数配合递归

/

function KeshiTypeSeed($list){

if($list){

echo '<tr align="center" bgcolor="#FFFFFF" height="22" class="seed"><td colspan="4"><table width="98%">';

foreach ($list as $k => $v) {

echo '<tr align="center" bgcolor="#FBFCE2" height="22" class="fid"><td width="7%"><span class="jia"></span>'$v['id']'</td><td width="14%">'$v['yiyuan']'</td><td width="14%">'$v['name']'</td><td><span class="coolbg" onClick="winopen(\'/Code/keshi_edit/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'\',\'id'$v['id']'\',1000,650)">编辑</span> <span alt="'$v['id']'" title="'$v['name']'" class="ksjb">管理2</span> <a href="/Yisheng/index/yiyuanid/'$v['yiyuanid']'/keshiid/'$v['id']'" class="coolbg">管理</a> <a href="/Code/keshi_del/yiyuanid/'$v['yiyuanid']'/id/'$v['id']'" class="coolbg">删除</a></td></tr>';

KeshiTypeSeed($v['childs']);

}

echo '</table></td></tr>';

}

}

3、在模板中使用缓存进行递归栏目

/我增加了点击展开关闭栏目的jquery代码,

<script>

/

点击展开子类

/

$("jia")click(function(){

if($(this)parent("td")parent("tr")next("seed")is(":hidden")){

$(this)parent("td")parent("tr")next("seed")show();

$(this)html("-");

}else{

$(this)parent("td")parent("tr")next("seed")hide();

$(this)html("+");

}

});

$("seed")prev("fid")find("td")find("spanjia")html("-");

/

点击关闭所有子类

/

$("#closeseed")click(function(){

if($(this)val() == "展开所有子类"){

$("seed")show();

$(this)val("关闭所有子类");

$each($("jia"),function(k,v){

if($(this)html()){

$(this)html("-");

}

});

}else{

$("seed")hide();

$(this)val("展开所有子类");

$each($("jia"),function(k,v){

if($(this)html()){

$(this)html("+");

}

});

}

});

});

</script>

//模板递归的部分

<php>

$keshis = S('keshi');//读取缓存

KeshiType($keshis);//递归输出数据

</php>

以上就是关于如何利用java递归遍历得到树全部的内容,包括:如何利用java递归遍历得到树、用java实现根据公司编码取得任意层级的部门列表、oracle 用递归层次查询 怎么只查询最底层的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9561124.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存