python 树结构 转换 list_树转列表的实现思路与代码

本文介绍了如何将树结构转换为列表结构,分别通过深度优先和广度优先遍历的方法,详细阐述了遍历思路及代码实现。深度优先采用递归,而广度优先则利用一层循环并在循环中修改列表。文章提供了测试数据和完整代码。
摘要由CSDN通过智能技术生成

背景

之前写了一篇列表转树的文章,有列表转树的需求自然就会有树转列表的需求,这里我把树转列表的思路与代码再整理一下。

思路分析

需求是什么?

老规矩,上图

先说一下整体思路,就是遍历树中的每一个节点,在遍历过程中要把节点的父节点id记录下来,并作为该节点的parentId属性值(保留层级关系,后续根据这个parentId和节点的id可以转回树结构),然后把该节点存入一个列表中。遍历过程完成,也就实现了把树结构转换成了列表结构。

树的遍历方式有两种,一种是深度优先遍历,一种是广度优先遍历,这两种方式思路如下图所示:

广度优先:

深度优先

思路看这两个图应该理得清楚了

我这里深度优先遍历采用了递归的方式,然后广度优先遍历采用了循环的方式。

执行步骤

先说深度优先吧:

从第一层开始遍历,遍历该层中所有节点,为每一个遍历到的节点添加上parentId属性,存入结果列表。

每一个遍历节点存入结果列表后,检测该节点是否存在子节点,如果存在,则将子节点作为数据源重复第一步

当所有的节点都处理完成后,整个树结构也就完成了转化

再说说广度优先:

从第一层开始遍历,遍历该层中所有节点,为每一个遍历到的节点添加上parentId属性,存入结果列表。

每一个遍历节点存入结果列表后,检测该节点是否存在子节点,如果存在,则将子节点数据项push到第一层遍历的列表中(这里相当于在for循环的过程中,修改了被遍历的数组的内容,在循环过程中把它变长了)

当所有的节点都处理完成后,整个树结构也就完成了转化

代码

深度优先

/*

* 深度优先遍历树

* 一个递归方法

* @params tree:要转换的树结构数据

* @params list:保存结果的列表结构数据,初始传[]

* @params parentId:当前遍历节点的父级节点id,初始为null(因为根节点无parentId)

* */

function toListDF (tree, list, parentId = null) {

for (let node of tree) {

list.push({

id: node.id,

name: node.name,

children: [],

parentId

})

if (node.children.length !== 0) {

toList(node.children, list, node.id)

}

}

}

广度优先:

/*

* 广度优先遍历树

* 一层循环

* @params tree:要转换的树结构数据

* @output list:返回转换好的列表结构数据

* */

function toListBF (tree) {

const tempList = tree.slice(0)

const res = []

for (let node of tempList) {

// 向结果中push每一个节点的数据

res.push({

id: node.id,

name: node.name,

children: [],

parentId: node.parentId === undefined ? null : node.parentId

})

// 如果该节点还有子节点,那么将子节点追加到待循环列表的后面

if (node.children.length !== 0) {

// 这里注意,push的是children里面的项

tempList.push(...node.children.map((item) => {

// 这里给每一项加上parentId

item.parentId = node.id

return item

}))

}

}

return res

}

这里给一个简单的树结构数据用来测试

const tree = [

{

id: 0,

name: 'root',

children: [

{

id: 1,

name: 'child1',

children: [

{

id: 4,

name: 'child1-1',

children: []

},

{

id: 5,

name: 'child1-2',

children: []

}

]

},

{

id: 2,

name: 'child2',

children: [

{

id: 6,

name: 'child2-1',

children: [

{

id: 8,

name: 'child2-1-1',

children: []

}

]

}

]

},

{

id: 3,

name: 'child3',

children: [

{

id: 7,

name: 'child3-1',

children: []

}

]

}

]

}

]

上面代码直接扔到浏览器中即可运行,可自行看看结果。

总结

树转列表过程中,我这里的深度优先采用了递归方式,可能会对内存占用较多,使用时请自行权衡。

在广度优先的方式中,只用了一层循环,这里有一个核心的点,就是js在循环列表过程中,被循环的列表是可以修改的,比如push一个数据项,这样会让for循环多运行一次,这个点理解之后,我这里的广度优先遍历树的方法就好理解了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现树转列表的一种常见方式是通过递归实现,具体步骤如下: 1. 定义一个空列表 result 用于存储转换后的列表。 2. 遍历树的每一个节点,如果该节点不为空,则将节点的值添加到 result 中。 3. 对节点的左子树和右子树进行递归操作,直到遍历完整棵树。 4. 返回 result 列表。 下面是一段 Python 代码实现树转列表的功能: ```python def treeToList(root): result = [] if root: result.append(root.val) result += treeToList(root.left) result += treeToList(root.right) return result ``` 其中,root 表示树的根节点,val 表示节点的值,left 和 right 分别表示节点的左子树和右子树。 使用该函数,可以将一棵树转换为列表,例如: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) print(treeToList(root)) # [1, 2, 4, 5, 3] ``` 在上面的例子中,我们创建了一棵树,并将其转换为一个列表。结果为 [1, 2, 4, 5, 3],表示树的先序遍历的结果。 ### 回答2: Python树转列表的问题可以通过递归的方式来解决。首先,我们可以定义一个递归函数,该函数将接收一个树作为参数,并将树转换为列表。 具体的实现步骤如下: 1. 首先判断树是否为空。如果为空,则返回一个空列表。 2. 如果树不为空,则创建一个空列表result。 3. 将树的根节点的值添加到result列表中。 4. 递归地将树的左子树转换为列表,并将转换后的列表添加到result列表中。 5. 递归地将树的右子树转换为列表,并将转换后的列表添加到result列表中。 6. 返回result列表。 下面是一个示例代码: ```python class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None def treeToList(root): if root is None: return [] result = [] result.append(root.value) result += treeToList(root.left) result += treeToList(root.right) return result # 创建一个树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 调用函数将树转换为列表 result = treeToList(root) print(result) # 输出列表:[1, 2, 4, 5, 3] ``` 以上代码中,我们定义了一个TreeNode类来表示树的节点,然后创建了一个树,并调用函数treeToList来将树转换为列表。最后,输出转换后的列表。 需要注意的是,这只是将树的节点值转换列表,并没有包含树的结构信息。如果需要包含树的结构信息,可以修改递归函数的实现。 ### 回答3: 在Python中,可以通过递归的方式将树转化为列表。 树是由节点组成的数据结构,每个节点可以有一个或多个子节点。而列表是一种线性的数据结构,可以容纳任意类型的元素。 要将树转化为列表,可以按照树的遍历方式进行。一种常用的遍历方式是深度优先遍历(DFS)。通过递归,可以遍历树的所有节点,并将节点的值存储到列表中。 具体的步骤如下: 1. 创建一个空的列表,用于存储树的节点值。 2. 判断树是否为空,如果为空则返回空列表。 3. 否则,将树的根节点值添加到列表中。 4. 遍历树的子节点,对每个子节点执行递归操作。 5. 递归操作将子节点转化为列表,并将其添加到父节点的列表中。 以下是使用Python代码实现树转列表的示例: ```python def tree_to_list(node): result = [] # 创建空列表 # 树为空的情况 if node is None: return result # 将根节点值添加到列表中 result.append(node.value) # 遍历子节点 for child in node.children: # 递归将子节点转化为列表,并添加到父节点列表中 result.extend(tree_to_list(child)) return result ``` 这样,经过树转列表的操作,我们可以得到一个包含树中所有节点值的列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值