Tree树形菜单递归查询方法

合集下载

vue中tree组件,递归遍历所有树形节点数据,获取节点的id值

vue中tree组件,递归遍历所有树形节点数据,获取节点的id值

vue中tree组件,递归遍历所有树形节点数据,获取节点的id值需求:项⽬需要,tree组件中所有节点要⽀持⼀键全部展开,⼀键全部收起功能。

如下所⽰,点击某个按钮,所有的节点全部展开,再次点击,所有节点收起。

思路很清晰,tree组件中有个 expandedKeys属性,控制展开节点的信息,只要遍历所有的节点信息,把节点的id push到expandedKeys组数中,对应的节点⾃动会展开。

那么如何遍历所有树形节点信息,获取每个节点的id呢?没有必要为了获取每个节点的id信息,去后端查⼀下,因为前端已经有了所有树形节点的信息,只不过是按照层级嵌套成树结构⽽已。

难点体现在,遍历这样的树形结果,需要递归才⾏,因为不知道有多少层⼦节点。

直接上代码:// 递归获取所有节点idgetAllNodeId (expandedKeys, moduleDataList) {for (let i = 0; i < moduleDataList.length; i++) {// console.log('i in getAllNodeId: ', i)console.log('moduleDataList[i].id in getAllNodeId: ', moduleDataList[i].id)expandedKeys.push(moduleDataList[i].id)if (moduleDataList[i].children) {expandedKeys = this.getAllNodeId(expandedKeys, moduleDataList[i].children)}}return expandedKeys},changeOpenAllModuleFolderVisible () {console.log('in changeOpenAllModuleFolderVisible')this.openAllModuleFolderVisible = !this.openAllModuleFolderVisibleif (!this.openAllModuleFolderVisible) {this.expandedKeys = []} else {this.expandedKeys = this.getAllNodeId(this.expandedKeys, this.moduleDataList)}console.log('this.expandedKeys: ', this.expandedKeys)}getAllNodeId()为递归⽅法,参数为expandedkeys(存储展开节点的数组),参数moduleDataList是页⾯中的树形节点数据数组。

递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

递归、嵌套for循环、map集合⽅式实现树形结构菜单列表查询有时候,我们需要⽤到菜单列表,但是怎么样去实现⼀个菜单列表的编写呢,这是⼀重要的问题。

⽐如我们需要编写⼀个树形结构的菜单,那么我们可以使⽤JQuery的zTree插件:例如现在需要编写⼀个这样的菜单列表。

那么就可以使⽤JQuery的zTree插件。

先看⼀下数据库表结构。

CREATE TABLE `permission` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`pid` int(11) DEFAULT NULL,`url` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;1、前端页⾯。

<div class="panel-body"><ul id="permissionTree" class="ztree"></ul></div><script>$(function () {var setting = {async: {enable: true,url:"${APP_PATH}/permission/loadData",autoParam:["id", "name=n", "level=lv"],otherParam:{"otherParam":"zTreeAsyncTest"},}};//树形结构$.fn.zTree.init($("#permissionTree"), setting);});</script>2、在这⾥呢,我使⽤的是ssm框架。

递归生成树形菜单

递归生成树形菜单

递归⽣成树形菜单递归⽣成树 //调⽤的⽅法 public ActionResult TreeView(){List<TreeModel> ltm = this.GetTrees();string tree = JsonConvert.SerializeObject(ltm).ToString();return Content(tree);}public List<TreeModel> GetTrees(){List<ModuleEntity> listQuery = map.GetList().ToList<ModuleEntity>();List<ModuleEntity> me = listQuery.Where(t => t.F_ParentId == "0").ToList<ModuleEntity>();if (me==null){return null;}List<ModuleEntity> Lme = me.ToList<ModuleEntity>();List<TreeModel> tm = new List<TreeModel>();foreach (ModuleEntity item in Lme){TreeModel tms = new TreeModel();tms.id = item.F_Id; = item.F_FullName;tms.parentId = item.F_ParentId;tms.spread = "true";List<TreeModel> child = new List<TreeModel>();GetTree(listQuery, child, item.F_Id);tms.children = child;tm.Add(tms);}return tm;}//递归获取数据public void GetTree(List<ModuleEntity> list,List<TreeModel> listTree,string parentId){foreach (ModuleEntity item in list){if (item.F_ParentId==parentId){TreeModel tm = new TreeModel();tm.id=item.F_Id;tm.parentId = item.F_ParentId; = item.F_FullName;tm.spread = "true";tm.children = new List<TreeModel>();listTree.Add(tm);GetTree(list,tm.children,tm.id);}}}树形菜单类public class TreeModel{public string id { get; set; }public string parentId { get; set; }public string name { get; set; }public string spread { get; set; }public string href { get; set; }public List<TreeModel> children { get; set; } }。

树形菜单-递归实现逻辑

树形菜单-递归实现逻辑

树形菜单-递归实现逻辑全文共四篇示例,供读者参考第一篇示例:树形菜单是一种常见的界面设计元素,通过树形结构展示信息,使用户能够轻松浏览和选择。

在Web开发中,树形菜单通常用于显示网站的导航菜单、项目结构、文件夹结构等。

实现树形菜单的方法有多种,其中递归是一种常用且有效的实现逻辑。

在本文中,我们将介绍树形菜单的递归实现逻辑,并通过示例代码演示如何使用递归来构建一个动态的树形菜单。

一、什么是递归?在程序设计中,递归是一种解决问题的方法,通过将问题分解成规模较小的子问题来解决整体问题。

递归函数会反复调用自身,直到满足某个终止条件才停止递归。

递归在数据结构和算法中有着广泛的应用,如树形结构的遍历、图的搜索等。

二、树形菜单的数据结构在实现树形菜单之前,首先要明确树形结构的数据表示方法。

通常树形菜单的数据结构可以用对象或数组来表示,每个节点包含一些基本信息和子节点信息。

一个简单的树形菜单数据结构如下所示:```javascript{id: 1,name: 'Root',children: [{ id: 2, name: 'Node 1', children: [] },{ id: 3, name: 'Node 2', children: [{ id: 4, name: 'Node 2-1', children: [] },{ id: 5, name: 'Node 2-2', children: [] }] },{ id: 6, name: 'Node 3', children: [] },]}```在上面的示例中,树形菜单包含了一个根节点和三个子节点,每个节点都包含了id、name和children属性,其中children是一个数组,用于存储子节点信息。

三、递归构建树形菜单接下来,我们将演示如何使用递归来构建一个树形菜单。

递归查询树形结构的SQL

递归查询树形结构的SQL

递归查询树形结构的SQL递归查询树形结构是在数据库中对一个树形结构进行查询操作时使用的一种方法。

在树形结构中,每个节点都有一个唯一的标识符(ID)和一个父节点。

递归查询可以通过递归地向上或向下遍历树来查找与指定节点相关的所有子节点或父节点。

下面是一个示例,假设我们有一个名为"employees"的表,它包含员工信息和每个员工的上级。

表结构如下:```CREATE TABLE employeesid INTEGER PRIMARY KEY,name VARCHAR(100) NOT NULL,manager_id INTEGER,FOREIGN KEY (manager_id) REFERENCES employees(id)```表中的数据如下:```+----+---------+------------+id , name , manager_id+----+---------+------------+1 , John , NULL2 , Mike , 13 , Lisa , 24 , Sarah , 25 , Tom , 16 , Emily , 57 , Jessica , 6+----+---------+------------+```现在,我们想要编写一个递归查询,找出指定员工及其所有直接或间接下属的信息。

首先,我们需要定义CTE。

在CTE中,我们指定递归部分的查询并为其命名。

然后,我们指定初始查询,即最顶层的员工。

```WITH RECURSIVE employee_hierarchy ASSELECT id, name, manager_idFROM employeesWHERE id = <employee_id> -- 指定员工IDUNIONALLSELECT employees.id, , employees.manager_idFROM employeesINNER JOIN employee_hierarchy ON employee_hierarchy.id = employees.manager_id```上述查询中,使用联接将当前递归结果集与雇员表进行联接操作,以查找下一个级别的员工。

mysql 树状数据查询语句

mysql 树状数据查询语句

mysql 树状数据查询语句在MySQL中,要查询树状数据,通常可以使用递归查询或者使用闭包表来实现。

下面我将分别介绍这两种方法。

1. 递归查询:如果你的MySQL版本支持递归公用表表达式(CTE),你可以使用递归查询来处理树状数据。

假设你有一个名为`tree_table`的表,包含`id`和`parent_id`两个字段,表示树状结构中节点的ID和父节点的ID。

你可以使用如下的递归查询语句来查询树状数据:sql.WITH RECURSIVE tree_cte AS (。

SELECT id, parent_id, name.FROM tree_table.WHERE id = <your_starting_node_id>。

UNION ALL.SELECT t.id, t.parent_id, .FROM tree_table t.JOIN tree_cte c ON t.parent_id = c.id.)。

SELECT FROM tree_cte;在上面的查询语句中,`tree_table`是你的树状数据表的名称,`id`和`parent_id`分别是节点的ID和父节点的ID,`name`是节点的名称。

`<your_starting_node_id>`是你希望从树中哪个节点开始查询的节点ID。

2. 闭包表:如果你的MySQL版本不支持递归公用表表达式,你可以使用闭包表来查询树状数据。

闭包表是一个包含所有祖先节点和后代节点关系的表。

你可以通过以下步骤创建闭包表并查询树状数据:首先,创建一个名为`closure_table`的表,包含`ancestor`和`descendant`两个字段,表示祖先节点和后代节点之间的关系。

然后,使用递归查询或存储过程来填充闭包表,确保它包含所有的祖先节点和后代节点关系。

最后,你可以使用以下查询语句来查询树状数据:sql.SELECT t.id, .FROM tree_table t.JOIN closure_table c ON t.id = c.descendant.WHERE c.ancestor = <your_starting_node_id>;在这个查询语句中,`tree_table`是你的树状数据表的名称,`id`和`name`分别是节点的ID和名称,`closure_table`是你创建的闭包表的名称,`ancestor`和`descendant`分别是祖先节点和后代节点的字段,`<your_starting_node_id>`是你希望从树中哪个节点开始查询的节点ID。

tree的递归算法

tree的递归算法

tree的递归算法tree的数据结构:tree = [{check: false,children: [check: false,children: [{{check: false,children: [{check: false,children: [],code: "SD2016082600160",disabled: false,isLeaf: true,label: "⾦泰荔湾⼩区",name: "⾦泰荔湾⼩区",open: false,orgLeaf: false,parentCode: "O04464422616",parentName: "测试超长字段的组织",projectCodeList: []}],code: "O04464422616"disabled: false,isLeaf: false,label: "测试超长字段的组织",name: "测试超长字段的组织",open: false,orgLeaf: true,parentCode: "080311bbbe8642899d325742b2073805",projectCodeList: ["SD2016082600160"]},{check: false,children: [],code: "SD2016082600170",disabled: false,isLeaf: true,label: "⾼德公寓",name: "⾼德公寓",open: false,orgLeaf: false,parentCode: "080311bbbe8642899d325742b2073805",parentName: "集中管控标准版",projectCodeList: []}},{check: false,children: [],code: "p201809211",disabled: false,isLeaf: true,label: "集中管控测试项⽬",name: "集中管控测试项⽬",open: false,orgLeaf: false,parentCode: "fb3087611f248d93d67330b4938fff8e",parentName: "集中管控多项⽬集团",projectCodeList: []}],code: "080311bbbe8642899d325742b2073805",disabled: false,isLeaf: false,label: "集中管控标准版",name: "集中管控标准版",open: false,orgLeaf: false,parentCode: "fb3087611f248d93d67330b4938fff8e",projectCodeList: ["SD2016082600170"]],code: "fb3087611f248d93d67330b4938fff8e",disabled: false,isLeaf: false,label: "集中管控多项⽬集团",name: "集中管控多项⽬集团",open: false,orgLeaf: false,projectCodeList: ["p201811081", "p201809211", SD2016082600190", "SD2016082600164", "SD2016082600196",…]}]View Code1.根据code ,寻找tree⾥⾯的选中对象export function getActiveNode(tree,code){ tree: [{}] // 树型结构let node = {};finds(tree,code);function finds(tree,code) {for(let i=0;i<tree.length;i++){if(tree[i].code == code){node = tree[i]} else {if(tree[i].children && tree[i].children.length>0){finds(tree[i].children,code)}}}}return node;}2. 通过code筛选组织树节点,输出 [{}]export function filterNode (tree, code) {if (!code) {return}let resultArr = []for (let i = 0; i < tree.length; i++) {let item = tree[i]if (item.code == code) {resultArr.push(item)return resultArr} else if (item.children && item.children.length) {resultArr = filterNode(item.children, code)}}return resultArr}3.有⽗⼦关系的数组转换成树形结构的数组/*** 该⽅法⽤于将有⽗⼦关系的数组转换成树形结构的数组* 接收⼀个具有⽗⼦关系的数组作为参数* 返回⼀个树形结构的数组*/export function translateDataToTree (data) {let parents = data.filter((item,index) => {return index === data.length-1})//有⽗节点的数据let childrens = data.filter(value => value.parentCode)//定义转换⽅法的具体实现let translator = (parents, childrens) => {parents.forEach((parent) => {childrens.forEach((current, index) => {if (current.parentCode === parent.code) {//对⼦节点数据进⾏深复制,这⾥只⽀持部分类型的数据深复制,对深复制不了解的童靴可以先去了解下深复制let temp = JSON.parse(JSON.stringify(childrens))//让当前⼦节点从temp中移除,temp作为新的⼦节点数据,这⾥是为了让递归时,⼦节点的遍历次数更少,如果⽗⼦关系的层级越多,越有利 temp.splice(index, 1)//让当前⼦节点作为唯⼀的⽗节点,去递归查找其对应的⼦节点translator([current], temp)//把找到⼦节点放⼊⽗节点的childrens属性中typeof parent.children !== 'undefined' ? parent.children.push(current) : parent.children = [current]}})})}//调⽤转换⽅法translator(parents, childrens)//返回最终的结果console.log(parents)return parents}4. 递归获取第⼀个节点下⾯的第⼀个叶⼦节点// 查找⼀个树第⼀个节点的第⼀个叶⼦节点,深度遍历getFirstNode (tree) {var temp = {}var forFn = function (arr) {if (arr && arr.length > 0) {temp = arr[0]if (arr[0].children) {forFn(arr[0].children)}}}forFn(tree)return temp}5. 递归获取第⼀个节点下⾯的所有的第⼀个节点// 查找⼀个树多个第⼀个节点,深度遍历getFirstNode (tree) {var temp = []var forFn = function (arr) {if (arr && arr.length > 0) {temp.push(arr[0])if (arr[0].children) {forFn(arr[0].children)}}}forFn(tree)return temp}。

利用递归实现简单的树结构菜单

利用递归实现简单的树结构菜单

利⽤递归实现简单的树结构菜单数据格式:var data = [ {title: "11111",childs : [ {title:"aaaaa", childs:[ {title: "xg"} ]}, {title:"bbbbb"} ] }, {title: "22222",childs : [ {title:"aaaaa"}, {title:"bbbbb"} ] }];递归函数:function menu(data){ var ul = "<ul>"; for(var i = 0; i < data.length; i++){ ul+="<li><a>"+data[i].title+"</a>"; if(data[i].childs){ul+=argument.callee(data[i].childs);} ul+="</li>"; }; ul+="</ul>"; return ul;}调⽤:var menu = menu(data);结果:也可以做成jq插件var Menu = function(el,opt){ this.el = el; //this.default = {}, // 插件默认参数,在这⾥不需要 this.opt = opt; // this.opt = $.extend({},this.default,opt); // 插件默认参数和传参合并,在这⾥不需要};Menu.prototype = { init: function(){ var opt = this.opt; var ul = this.create(opt); this.el.append(ul);},create: function(opt){ var ul = '<ul>'; for(var i = 0; i < opt.length; i++){ ul += '<li>'+opt[i].title; if(opt[i].childred && opt[i].children != 'undefined'){ ul += arguments.callee(opt[i].childred) } ul += '</li>'; }; ul += '</ul>'; return ul;}}$.fn.menu = function(opt){ // 这⾥的this是指$(select); var menu = new Menu(this, opt); return menu.init();}调⽤: $(select).menu(data);结果和上⾯⼀样会的⼈觉得简单,不会的⼈再简单也不会,这个我也是花了很长时间才写出来。

JAVA递归生成树形菜单

JAVA递归生成树形菜单

JAVA递归⽣成树形菜单 递归⽣成⼀个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。

通过以下过程实现: 1.⾸先从菜单数据中获取所有根节点。

2.为根节点建⽴次级⼦树并拼接上。

3.递归为⼦节点建⽴次级⼦树并接上,直⾄为末端节点拼接上空的“树”。

⾸先,编写数据模型Menu。

每条菜单有⾃⼰的id、⽗节点parentId、菜单名称text、菜单还拥有次级菜单children。

1import java.util.List;23public class Menu {4private String id;5private String parentId;6private String text;7private String url;8private String yxbz;9private List<Menu> children;10public Menu(String id,String parentId,String text,String url,String yxbz) {11this.id=id;12this.parentId=parentId;13this.text=text;14this.url=url;15this.yxbz=yxbz;16 }17/*省略get\set*/18 } 创建树形结构的类MenuTree。

⽅法getRootNode获取所有根节点,⽅法builTree将根节点汇总创建树形结构,buildChilTree为节点建⽴次级树并拼接上当前树,递归调⽤buildChilTree不断为当前树开枝散叶直⾄找不到新的⼦树。

完成递归,获取树形结构。

1import java.util.ArrayList;2import java.util.List;34public class MenuTree {5private List<Menu> menuList = new ArrayList<Menu>();6public MenuTree(List<Menu> menuList) {7this.menuList=menuList;8 }910//建⽴树形结构11public List<Menu> builTree(){12 List<Menu> treeMenus =new ArrayList<Menu>();13for(Menu menuNode : getRootNode()) {14 menuNode=buildChilTree(menuNode);15 treeMenus.add(menuNode);16 }17return treeMenus;18 }1920//递归,建⽴⼦树形结构21private Menu buildChilTree(Menu pNode){22 List<Menu> chilMenus =new ArrayList<Menu>();23for(Menu menuNode : menuList) {24if(menuNode.getParentId().equals(pNode.getId())) {25 chilMenus.add(buildChilTree(menuNode));26 }27 }28 pNode.setChildren(chilMenus);29return pNode;30 }3132//获取根节点33private List<Menu> getRootNode() {34 List<Menu> rootMenuLists =new ArrayList<Menu>();35for(Menu menuNode : menuList) {36if(menuNode.getParentId().equals("0")) {37 rootMenuLists.add(menuNode);38 }39 }40return rootMenuLists;41 }42 } 最后,插⼊⼀些数据试试效果。

树形结构的菜单表设计与查询

树形结构的菜单表设计与查询

树形结构的菜单表设计与查询开发中经常会遇到树形结构的场景,⽐如:导航菜单、组织机构等等,但凡是有这种⽗⼦层级结构的都是如此,⼀级类⽬、⼆级类⽬、三级类⽬。

对于这种树形结构的表要如何设计呢?接下来⼀起探讨⼀下⾸先,想⼀个问题,⽤⾮关系型数据库存储可不可以?答案是肯定可以的,⽐如⽤mongoDB,直接将整棵树存成json。

但是,这样不利于按条件查询,当然也取决于具体的需求,抛开需求谈设计都是耍流氓。

在菜单这个场景下,⼀般还是⽤关系型数据库存储,可以将最终的查询结构缓存起来。

常⽤的⽅法有四种:每⼀条记录存parent_id每⼀条记录存整个tree path经过的node枚举每⼀条记录存 nleft 和 nright维护⼀个表,所有的tree path作为记录进⾏保存第⼀种:每条记录存储parent_id这种⽅式简单明了,但是想要查询某个节点的所有⽗级和⼦级的时候⽐较困难,势必需要⽤到递归,在mysql⾥⾯就得写存储过程,太⿇烦了。

当然,如果只有两级的话就⽐较简单了,⾃连接就搞定了,例如:第四种:单独⽤⼀种表保存节点之间的关系CREATE TABLE `city` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(16),PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT =1CHARACTER SET= utf8mb4;CREATE TABLE `city_tree_path_info` (`id` int(11) NOT NULL AUTO_INCREMENT,`city_id` int(11) NOT NULL,`ancestor_id` int(11) NOT NULL COMMENT '祖先ID',`level` tinyint(4) NOT NULL COMMENT '层级',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT =1CHARACTER SET= utf8mb4;上⾯这个例⼦中,city表代表城市,city_tree_path_info代表城市之间的层级关系,ancestor_id表⽰⽗级和祖⽗级ID,level是当前记录相对于ancestor_id⽽⾔的层级。

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js生成tree树形菜单(递归算法)
} const treeData = toTreeByRecursion(jsonData, 'id', 'parentId', null, 'children', treeOption) console.log(treeData)
说明:
parentIdNoneValue 父级标识空值这个参数如果跟你数据无父级时的值不一致时,就配置这个参数。比如:这里默认值为null,你根节点parentId的值为-1或''。 treeOption 参数可以不传,如果要绑定tree树形控件(一般都会有key、value、title这三个字段),那就需要配置这个参数,如果参数默认的配置跟你的不一样,那就通过参数覆盖的方式重新定 义。 treeOption 的三个绑定字段是指绑定你数据中的字段,实质就是把原数据字段绑定的tree树形控件需要的三个字段key、value、title。 想到了再补充。。。
return parent[parentIdField] === parentIdNoneValue // 返回第一层 }) }
使用示例:
var jsonData = [ { id: '1', name: '1', parentId: null, rank: 1 }, { id: '2', name: '1-1', parentId: '1', rank: 1 }, { id:ห้องสมุดไป่ตู้'3', name: '1-2', parentId: '1', rank: 1 },
const treeOption = { enable: false, // 是否开启转tree插件数据 keyField: 'key', // 标识字段名称 valueField: 'value', // 值字段名称 titleField: 'title', // 标题字段名称 keyFieldBind: 'id', // 标识字段绑定字段名称 valueFieldBind: 'id', // 值字段名称绑定字段名称 titleFieldBind: 'name' // 标题字段名称绑定字段名称

树形结构递归算法实现

树形结构递归算法实现

树形结构递归算法实现一、引言树是一种重要的数据结构,它在实际应用中被广泛使用。

树形结构递归算法是实现树的常用方法之一,本文将详细介绍树形结构递归算法的实现。

二、树的基本概念1. 树的定义树是由n(n>=0)个节点组成的有限集合,其中:(1)每个节点都有一个父节点,除了根节点;(2)每个节点可以有任意多个子节点;(3)没有父节点的节点称为根节点。

2. 树的术语(1)父节点:一个节点向下连接其子节点的边所指向的节点;(2)子节点:一个节点向上连接其父节点的边所指向的节点;(3)兄弟节点:拥有同一个父亲的两个或多个子女;(4)叶子结点:没有子女的结点称为叶子结点或终端结点;(5)度数:一个结点拥有的子女数目称为该结点的度数。

三、递归算法基本原理1. 递归函数定义递归函数是指在函数内部调用自身函数,以解决问题或完成任务。

递归函数包含两部分内容:(1)基本情况:即终止条件,当满足某个条件时,递归函数不再调用自身函数,直接返回结果;(2)递归情况:即递归过程,当未满足终止条件时,递归函数会调用自身函数。

2. 递归算法的实现递归算法通常包含以下步骤:(1)判断是否满足终止条件;(2)如果满足终止条件,则直接返回结果;(3)如果未满足终止条件,则进行递归调用自身函数,并将问题规模减小。

四、树形结构递归算法实现1. 遍历树遍历树是指按照一定的顺序访问树中的每个节点。

树的遍历方式包括前序遍历、中序遍历和后序遍历。

其中,前序遍历指先访问根节点,然后按照从左到右的顺序依次访问每个子节点;中序遍历指先访问左子节点,然后访问根节点,最后访问右子节点;后序遍历指先访问左右子节点,最后访问根节点。

(1)前序遍历实现:void preOrder(TreeNode* root) { if (root == NULL) {return;}cout << root->val << " ";preOrder(root->left);preOrder(root->right);}(2)中序遍历实现:void inOrder(TreeNode* root) { if (root == NULL) {return;}inOrder(root->left);cout << root->val << " ";inOrder(root->right);}(3)后序遍历实现:void postOrder(TreeNode* root) {if (root == NULL) {return;}postOrder(root->left);postOrder(root->right);cout << root->val << " ";}2. 求树的深度树的深度是指从根节点到最远叶子节点的路径上的节点数。

postgrel 树形递归查询函数

postgrel 树形递归查询函数

postgrel 树形递归查询函数什么是树形递归查询函数?树形递归查询函数(Tree-structuredrecursive queries)是一种常用的计算机科学技术,用于在数据库系统中进行树状数据的递归查询。

通过使用这种查询函数,用户可以方便地获取与树形结构相关的数据,并进行各种需要的分析和处理。

为什么需要树形递归查询函数?树形结构是一种常见的数据组织形式,例如组织机构、文件系统、社交网络等等。

在处理这些数据时,我们经常需要对树形结构进行递归查询,以获取某个节点的子节点、父节点、兄弟节点等相关信息。

而传统的查询语句(如SQL)在处理这种递归查询时存在一定的困难。

为了解决这个问题,就需要使用到树形递归查询函数。

树形递归查询函数的基本原理是什么?树形递归查询函数基于递归的思想,通过递归地查询树结构中的各个节点和它们的关系,从而达到获取和处理树形数据的目的。

这种函数通常包含两个部分:递归终止条件和递归查询操作。

递归终止条件用于判断是否继续递归,而递归查询操作用于获取节点的相关信息,并继续递归查询其子节点。

如何使用树形递归查询函数?要使用树形递归查询函数,首先需要定义一个递归查询函数,该函数使用树形结构中的某个节点作为输入参数,并返回该节点以及其子节点的查询结果。

接下来,我们可以在查询语句中调用这个递归查询函数,并指定需要查询的节点。

查询结果将包含所查询节点以及其子节点的相关信息。

以PostgreSQL为例,其提供了一个名为“WITH RECURSIVE”的查询语法,用于实现树形递归查询函数。

这个语法的基本结构如下:WITH RECURSIVE recursive_query_name (initial_query) AS (nonrecursive_termUNION ALLrecursive_term) SELECT * FROM recursive_query_name;在这个语法中,我们首先定义了一个名为“recursive_query_name”的递归查询名,并在括号中指定初始查询(initial_query)的内容。

Js树形数据递归查询该节点的所有父级节点、查询该节点的所有子节点

Js树形数据递归查询该节点的所有父级节点、查询该节点的所有子节点

Js树形数据递归查询该节点的所有⽗级节点、查询该节点的所有⼦节点Js 递归树形数据查询该节点的所有⽗级节点、查询该节点的所有⼦节点等数据var data2= [{id: 1,label: '⼀级 1',children: [{id: 4,label: '⼆级 1-1',children: [{id: 9,label: '三级 1-1-1'}, {id: 10,label: '三级 1-1-2'}]}]},{id: 2,label: '⼀级 2',children: [{id: 5,label: '⼆级 2-1'}, {id: 6,label: '⼆级 2-2'}]},{id: 3,label: '⼀级 3',children: [{id: 7,label: '⼆级 3-1'}, {id: 8,label: '⼆级 3-2'}]}];⽅法根据ID获取该节点的所有⽗节点的对象function getParentId(list,id) {for (let i in list) {if(list[i].id==id){return [list[i]]}if(list[i].children){let node=getParentId(list[i].children,id);if(node!==undefined){return node.concat(list[i])}}}}getParentId(data2,10)//打印出来就是想要的数据根据ID获取该节点的对象function getId(list,id) {for (let i in list) {if(list[i].id==id){return [list[i]]}if(list[i].children){let node=getParentId(list[i].children,id);if(node!==undefined){return node;}}}}getId(data2,4)//打印出来就是想要的数据根据ID获取所有⼦节点的对象,⾸先把该节点的对象找出来,上⾯getId()这个⽅法function getNodeId(list,newNodeId=[]) {for (let i in list) {newNodeId.push(list[i])if(list[i].children){getNodeId(list[i].children,newNodeId);}}return newNodeId;}}//查找id=4的所有⼦级节点let objId=getId(data2,4);let childId=getNodeId(objId);//打印出来就是想要的数据我这⾥的⽅法都是查找的对象,如果只是返回ID,根据需要Push的时候改成Push id 即可。

递归查询单表菜单树形结构(多级树形结构)

递归查询单表菜单树形结构(多级树形结构)

递归查询单表菜单树形结构(多级树形结构)/*** 递归查询树形结构==================================================*/@PostMapping("/recursive")@ResponseBodypublic List<Map<String, Object>> findWorld() {List<Map<String, Object>> allList = new ArrayList<>(); //接收所有的信息List<Map<String, Object>> parentMapList = new ArrayList<>(); //接收获取的⽗节点List<Map<String, Object>> retList = new ArrayList<>(); //接收获取的⽗节点try {allList = myTestService.findWorld(); //获取所有的信息for (int i = 0; i < allList.size(); i++) { //循环所有信息找出所有的根节点(p_id=-1)if ("-1".equals(allList.get(i).get("p_id").toString())) {parentMapList.add(allList.get(i)); //将找出来的根节点重新存到⼀个List<Map>集合中allList.remove(i); //从所有的数据中移除根节点i--; //每移除⼀个根节点就将所有数据的个数减⼀}}retList = recursive(allList,parentMapList); //调⽤此⽅法寻找⼦节点} catch (Exception e) {e.printStackTrace();}return retList;}/*** @param parentMapList 所有⽗节点* @param allList 所有数据* @return*/public List<Map<String, Object>> recursive(List<Map<String, Object>> allList,List<Map<String,Object>> parentMapList) {//循环根节点for(int j = 0;j<parentMapList.size();j++){List<Map<String, Object>> tempList = new ArrayList<>(); //⽤来存取⼦节点//循环全部节点,判断节点中P_id是否与根节点中的id相同for(int k = 0;k<allList.size();k++){if(allList.get(k).get("p_id").toString().equals(parentMapList.get(j).get("id").toString())){tempList.add(allList.get(k));}}if(tempList.size()>0){parentMapList.get(j).put("children",tempList);recursive(allList,tempList); //此次循环⼜将tempList作为parentMapList(⽗节点去找其他的⼦节点),直到没有⼦节点在执⾏j+1}}return parentMapList;}。

递归查找父节点

递归查找父节点

递归查找父节点
递归查找父节点是一种在树形结构中寻找某个节点的直接上级节
点的方法。

在递归查找中,我们从当前节点开始,不断向上查找其父
节点,直到根节点或者找到所需的父节点为止。

具体实现时,我们可以使用一个递归函数来进行查找。

该函数接
收一个节点作为参数,并在每一次递归中,判断当前节点是否拥有父
节点。

如果有父节点,则返回该父节点;如果没有父节点,则继续递
归查找当前节点的父节点,直到找到或者达到根节点。

递归查找父节点的过程可以形象地表达为:不断向上攀爬树的枝干,直到找到需要的目标节点或者到达树的根部。

需要注意的是,在递归查找的过程中,我们需要判断当前节点是
否为空,以避免出现空指针异常。

当当前节点为空时,说明已经到达
了树的根部,仍未找到目标节点的父节点,此时可以返回空值或者指
定一个特殊的值来表示未找到。

递归查找父节点的思想简单而直接,通过递归的方式,可以在复
杂的树形结构中快速地找到某个节点的父节点。

在实际应用中,递归
查找父节点可以帮助我们处理树形结构相关的问题,提高程序的效率。

总的来说,递归查找父节点是一种常用且强大的树形结构查找方法,它可以帮助我们快速地定位某个节点的直接上级节点,提高程序
的可读性和效率。

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js生成tree树形菜单(递归算法)

js实现树级递归,通过js⽣成tree树形菜单(递归算法)1、效果图需求:⾸先这是⼀个数据集—js的类型,我们需要把⽣成⼀个tree形式的对象 :var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id: 5, name: "系统设置", pid: 0 },{ id: 6, name: "权限管理", pid: 5 },{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },];id,与pid之间的对应关系,当pid不存在,或pid:0的时候,这⼀项,应该为树的顶端,那么我们需要去重新建⼀次索引,怎么建呢,,,以原数据集的id的值,重新⽣成⼀个数据如下:var data = [{id: 1, name: "办公管理", pid: 0 ,children:[{ id: 2, name: "请假申请", pid: 1,hildren:[{ id: 4, name: "请假记录", pid: 2 },],},{ id: 3, name: "出差申请", pid: 1},]},{id: 5, name: "系统设置", pid: 0 ,children:[{ id: 6, name: "权限管理", pid: 5,hildren:[{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },]},]},];js转换为上⾯数据集,实现数树级递归⽅法:<script>function toTree(data) {// 删除所有 children,以防⽌多次调⽤data.forEach(function (item) {delete item.children;});// 将数据存储为以 id 为 KEY 的 map 索引数据列var map = {};data.forEach(function (item) {map[item.id] = item;});// console.log(map);var val = [];data.forEach(function (item) {// 以当前遍历项,的pid,去map对象中找到索引的idvar parent = map[item.pid];// 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的⽗级中if (parent) {(parent.children || ( parent.children = [] )).push(item);} else {//如果没有在map中找到对应的索引ID,那么直接把当前的item添加到 val结果集中,作为顶级val.push(item);}});return val;}console.log(toTree(data))</script>使⽤jquery,⽣成上述效果图的完整实例:<!DOCTYPE html><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title><script src="jquery-1.8.3.min.js"></script></head><body><script type="text/javascript">$(function () {var data = [{ id: 1, name: "办公管理", pid: 0 },{ id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 },{ id: 4, name: "请假记录", pid: 2 },{ id: 5, name: "系统设置", pid: 0 },{ id: 6, name: "权限管理", pid: 5 },{ id: 7, name: "⽤户⾓⾊", pid: 6 },{ id: 8, name: "菜单设置", pid: 6 },];GetData(0, data);$("body").append(menus);});//菜单列表htmlvar menus = '';//根据菜单主键id⽣成菜单列表html//id:菜单主键id//arry:菜单数组信息function GetData(id, arry) {var childArry = GetParentArry(id, arry);if (childArry.length > 0) {menus += '<ul>';for (var i in childArry) {menus += '<li>' + childArry[i].name;GetData(childArry[i].id, arry);menus += '</li>';}menus += '</ul>';}}//根据菜单主键id获取下级菜单//id:菜单主键id//arry:菜单数组信息function GetParentArry(id, arry) {var newArry = new Array();for (var i in arry) {if (arry[i].pid == id)newArry.push(arry[i]);}return newArry;}</script></body></html>。

java树形递归

java树形递归

java树形递归在Java中,树形递归指的是在树形结构中递归遍历每一个节点。

通常情况下,树形递归都是通过递归函数的方式实现的。

下面是实现树形递归的一些常见方法:1.递归遍历树递归遍历树是最常见的树形递归方法。

基本思路是,先遍历根节点,然后遍历每一个子节点,并以此类推,直到遍历完整个树。

示例代码:```public void traverseTree(TreeNode root) {if (root == null) {return;}System.out.println(root.val);traverseTree(root.left);traverseTree(root.right);}```2.递归查找节点递归查找节点是指在树形结构中递归查找某一个节点。

基本思路是,先比较当前节点,如果相等则返回当前节点,否则递归查找左子树和右子树,直到找到目标节点。

示例代码:```public TreeNode searchNode(TreeNode root, int target) { if (root == null) {return null;}if (root.val == target) {return root;}TreeNode left = searchNode(root.left, target);if (left != null) {return left;}TreeNode right = searchNode(root.right, target);if (right != null) {return right;}return null;}```3.递归插入节点递归插入节点是指在树形结构中递归插入一个新的节点。

基本思路是,先比较当前节点,如果要插入的节点应该在当前节点的左子树中,则递归插入左子树,若应该在右子树中则递归插入右子树,直到找到合适的位置。

示例代码:```public TreeNode insertNode(TreeNode root, int val) {if (root == null) {return new TreeNode(val);}if (val < root.val) {root.left = insertNode(root.left, val);} else {root.right = insertNode(root.right, val);}return root;}```总结以上是实现树形递归的三种常见方法,它们共同具有的特点是都是采用递归函数的方式进行实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
getAllChildren(children,resultTrees);
}
return resultTrees;
பைடு நூலகம் }
}
假设你要查询的父节点id = 1,那么你Service层这样调用:
首先调用dao的getTopChildren方法查询得到顶级节点下的直接子节点
下面的进行数据库查询代码略去...
}
/**
* 根据提供的节点集合递归查询集合里每个节点的子节点,最终统一返回所有的子节点
* topChildren 是当前节点的直接子节点集合
* resultTrees 是最终返回的所有子节点集合
//父节点
private Tree parent;
//子节点集合
private List<Tree> children;
get set略....
}
//TreeDao实现类,TreeDao接口类代码略
public class TreeDaoImpl{
//如果当前节点是叶子节点,跳过不进行递归查询子节点
if(tree.leaf){
continue;
}
List<Tree> children = getTopChildren(tree.getId());
*/
public List<Tree> getAllChildren(List<Tree> topChildren,List<Tree> resultTrees){
for(Tree tree:topChildren){
resultTrees.add(tree);
实体类Tree.java
public class Tree{
//主键id
private Long id;
//节点名称
private String name;
//是否为叶子节点(即没有子节点)
private boolean leaf;
treeDao.getAllChildren(topList,allChildren);
执行完getAllChildren()方法后,allChilren 就存储了顶级节点下的所有子节点包括孙子节点直至叶子节点
得到了所有节点List,你们.net的tree控件 貌似可以绑定一个list 这样就可以实现一个树形菜单了 至于tree控件绑定xml,那你得再写个方法,遍历得到的list集合生成xml文件,再绑定到tree控件
如:
List<Tree> topList = treeDao.getTopChildren(1);
然后调用dao的getAllChildren()递归刚才得到的节点list查询得到所有节点集合
//用于存储最终返回的所有子节点
List<Tree> allChilren = new ArrayList<Tree>();
/**
* 查询某父节点下的直接子节点(即不包含孙子节点等)
*/
public List<Tree> getTopChildren(Long parentId){
String sql = "select * from tree t where t.parentId = ?";
相关文档
最新文档