java递归遍历树效率_遍历多叉树(递归、非递归广度优先、深度优先)

本文介绍了如何使用Java遍历树形结构数据,包括递归和非递归两种方法,其中非递归的广度优先和深度优先方法在效率上更优。提供了具体的代码示例进行详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的遍历一个树形结构数据的几种方法、非递归方法效率最好。

(function (window, undefined) {

var treeNodes = [

{

id: 1,

name: '1',

children: [

{

id: 11,

name: '11',

children: [

{

id: 111,

name: '111',

children:[]

},

{

id: 112,

name: '112'

}

]

},

{

id: 12,

name: '12',

children: []

}

],

users: []

},

{

id: 2,

name: '2',

children: [

{

id: 22,

name: '22',

children: []

}

]

}

];

//递归实现

var parseTreeJson = function(treeNodes){

if (!treeNodes || !treeNodes.length) return;

for (var i = 0, len = treeNodes.length; i < len; i++) {

var childs = treeNodes[i].children;

console.log(treeNodes[i].id);

if(childs && childs.length > 0){

parseTreeJson(childs);

}

}

};

console.log('------------- 递归实现 ------------------');

parseTreeJson(treeNodes);

//非递归广度优先实现

var iterator1 = function (treeNodes) {

if (!treeNodes || !treeNodes.length) return;

var stack = [];

//先将第一层节点放入栈

for (var i = 0, len = treeNodes.length; i < len; i++) {

stack.push(treeNodes[i]);

}

var item;

while (stack.length) {

item = stack.shift();

console.log(item.id);

//如果该节点有子节点,继续添加进入栈底

if (item.children && item.children.length) {

//len = item.children.length;

// for (i = 0; i < len; i++) {

// stack.push(item.children[i]);

// }

stack = stack.concat(item.children);

}

}

};

console.log('------------- 非递归广度优先实现 ------------------');

iterator1(treeNodes);

//非递归深度优先实现

var iterator2 = function (treeNodes) {

if (!treeNodes || !treeNodes.length) return;

var stack = [];

//先将第一层节点放入栈

for (var i = 0, len = treeNodes.length; i < len; i++) {

stack.push(treeNodes[i]);

}

var item;

while (stack.length) {

item = stack.shift();

console.log(item.id);

//如果该节点有子节点,继续添加进入栈顶

if (item.children && item.children.length) {

// len = item.children.length;

// for (; len; len--) {

// stack.unshift(item.children[len - 1]);

// }

stack = item.children.concat(stack);

}

}

};

console.log('------------- 非递归深度优先实现 ------------------');

iterator2(treeNodes);

})(window);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值