Python操作树结构、树结构节点

1.将如下nodes列表转化为树结构

nodes = [
        {'id': 1, 'name': '1', 'parent_id': None},
        {'id': 2, 'name': '2', 'parent_id': 1},
        {'id': 3, 'name': '3', 'parent_id': 1},
        {'id': 4, 'name': '4', 'parent_id': 2},
        {'id': 5, 'name': '5', 'parent_id': 3},
        {'id': 6, 'name': '6', 'parent_id': 5},
    ]


tree = [node for node in nodes if node['parent_id'] is None]
for node in nodes:
    node['children'] = [n for n in nodes if node['id'] == n['parent_id']]

以上三行代码就搞定啦

有如下树结构:

tree = [{'id':1 ,'name': '1', 'children': [{'id':2 ,'name': '2'}, {'id':3 ,'name': '3', 'children': [{'id':4 ,'name': '4'},{'id':5 ,'name': '5'}]}]}]

给定某个子节点,如何获取所有父节点?

def get_parent_name(node_id, tree, nodes=[]):
    """获取树结构某个节点的所有父节点名称列表"""
    for node in tree:
        if node['id'] == node_id:
            return nodes
        else:
            if 'children' in node:
                result = get_parent_name(node_id, node['children'], nodes + [node['name']])
                if not result:
                    continue
                return result
            return []
    else:
        return []

如果我想获取所有子节点列表?

def get_current_node(node_id, tree):
    """获取树结构某个节点"""
    for node in tree:
        if node['id'] == node_id:
            return node
        else:
            if 'children' in node:
                result = get_current_node(node_id, node['children'])
                if not result:
                    continue
                return result

def get_sub_node_ids(node, sub_node_ids=None):
    """获取树结构某个节点的所有子节点id"""
    if sub_node_ids is None:
        sub_node_ids = []
    if 'children' in node:
        for n in node['children']:
            sub_node_ids.append(n['id'])
            sub_node_ids = get_sub_node_ids(n, sub_node_ids)
    return sub_node_ids



node = get_current_node('2', tree)
sub_node_ids = get_sub_node_ids(node)

2、补充算法

def get_current_node(node_id, tree):
    """深度优先算法:获取树结构某个节点"""
    for node in tree:
        if node['id'] == node_id:
            return node
        else:
            if 'children' in node:
                result = get_current_node(node_id, node['children'])
                if not result:
                    continue
                return result

def get_current_node_(node_id, tree):
    """广度优先算法:获取树结构某个节点"""
    queue = [tree] if isinstance(tree, dict) else tree
    while queue:
        node = queue.pop(0)
        if node['id'] == node_id:
            return node
        else:
            if 'children' in node:
                queue.extend(node['children'])

def get_sub_node_ids(node, sub_node_ids=None):
    """深度优先算法:获取树结构某个节点的所有子节点id"""
    if sub_node_ids is None:
        sub_node_ids = []
    if 'children' in node:
        for n in node['children']:
            sub_node_ids.append(n['id'])
            sub_node_ids = get_sub_node_ids(n, sub_node_ids)
    return sub_node_ids

def get_sub_node_ids_(node, sub_node_ids=None):
    """广度优先算法:获取树结构某个节点的所有子节点id"""
    if sub_node_ids is None:
        sub_node_ids = []
    queue = [node]
    while queue:
        node = queue.pop(0)
        sub_node_ids.append(node['id'])
        if 'children' in node:
            queue.extend(node['children'])
    sub_node_ids.pop(0)
    return sub_node_ids

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值