首页 > 其他分享 >N叉树遍历模板

N叉树遍历模板

时间:2024-02-18 11:33:25浏览次数:23  
标签:node 遍历 val result root children 模板

N叉树(N-ary Tree)的类型和代码模板与二叉树有些相似,但由于N叉树具有多个子节点,因此在遍历和节点定义上有所不同。以下是N叉树的类型和相应的代码模板:

N叉树节点的定义:

class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children if children is not None else []

N叉树的遍历(递归和迭代):

1. 前序遍历(Preorder Traversal)

递归实现:

def preorder(root):
    result = []
    if root:
        result.append(root.val)
        for child in root.children:
            result.extend(preorder(child))
    return result

例子:N叉树前序遍历

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        res = []
        def dfs(root):
            if root is None:
                return
            res.append(root.val)
            for i in root.children:
                dfs(i)
        dfs(root)
        return res

迭代实现:

def preorder(root):
    result = []
    q = [root]
    while q:
        node = q.pop()
        if node:
            result.append(node.val)
            q.extend(reversed(node.children)) #或者使用 for child in node.children[::-1]
    return result

注意: reversed() 是 Python 内置函数,用于反转一个可迭代对象的元素顺序。在这个上下文中,node.children 是一个子节点列表,reversed(node.children) 返回一个反转后的子节点列表。在遍历 N 叉树时,我们使用栈来模拟递归调用。由于栈是先进后出的数据结构,我们希望先处理的子节点后进栈,以保证先处理左边的子节点。因此,我们使用 reversed() 来反转子节点列表,使得先处理的子节点在栈顶。
具体而言,stack.extend(reversed(node.children)) 将 node.children 中的子节点按照逆序添加到栈中。这样,下一次从栈中弹出的节点就是先处理的子节点,符合前序遍历的顺序。

2. 后序遍历(Postorder Traversal)

递归实现:

def postorder(root):
    result = []
    if root:
        for child in root.children:
            result.extend(postorder(child))
        result.append(root.val)
    return result

迭代实现:

def postorder(root):
    result = []
    stack = [root]
    while stack:
        node = stack.pop()
        if node:
            result.append(node.val)
            stack.extend(node.children)
    return result[::-1]

对于N叉树的层序遍历(Level Order Traversal),我们可以使用队列来实现。以下是N叉树层序遍历的代码模板

"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if root is None:
            return 
        q = deque()
        q.append(root)
        res = []
        while q:
            vals = []
            for _ in range(len(q)):
                node = q.popleft()
                vals.append(node.val) #node.children 返回的是一个子节点列表
                #extend 可以将 node.children 中的每个元素添加到队列,
                #而不是将整个列表作为一个元素添加
                if node.children: q.extend(node.children)
            res.append(vals)
        return res

标签:node,遍历,val,result,root,children,模板
From: https://www.cnblogs.com/taixian/p/18018998

相关文章

  • 模板默写
    别到时候题会做了板子不会写……数据结构主席树ProbFHQTreap可持久化FHQTreap图论支配树Prob上下界最大/最小流带负圈的费用流数学万能欧几里德杜教筛字符串ACAMSASAMGSAM……......
  • P1439 【模板】最长公共子序列
    首先找最大公共子序列,可以轻松想到$O(n^2)$的dp转移式子,$f_{i,j}=max\begin{cases}f_{i-1,j}&i>0\f_{i,j-1}&j>0\f_{i-1,j-1}+1&i>0,j>0,A_i=A_j\end{cases}$但是我们发现最后$n\le10^5$所以$n^2$的复杂度不够优,这个时候再看题目,发现A,B都是 1~n的排列,由此可知A,B......
  • P3384 【模板】重链剖分/树链剖分 - SGT && 重链剖分
    本题是非常非常非常纯粹的树剖,利用了重链剖分后下标的性质不多说上代码就好了#include<cstdio>#include<vector>#definelllonglongusingnamespacestd;constintN=1e5+5;intn,m,r;llp,a[N],b[N];vector<int>V[N];intfa[N],dep[N],siz[N],hson[N]......
  • 快读快写模板
    快读函数点击查看代码intread(){intsign=1,re_in=0;charc=getchar();while(c<'0'||c>'9'){if(c=='-')sign=-1;c=getchar();}while(c>='0'&&c<='9'){......
  • Vue.js前端框架之vite+vue+naive前端项目模板
    1.搭建Vue示例项目npmcreatevue cdvue-demo:进入项目目录npminstall:安装所有依赖npmrundev:启动项目2.了解Vue开发和工作原理2.1package.json类似于Python项目中pyproject.toml,包含了项目名称、版本、命令、依赖、设定2.2index.html浏览器访问到的HTML文件 ......
  • 代码随想录算法训练营第十五天 | 层次遍历 | 101. 对称二叉树 | 226.翻转二叉树
    226.翻转二叉树 已解答简单 相关标签相关企业 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[......
  • 力扣递归 广度优先搜索之102. 二叉树的层序遍历
    classSolution{   List<List<Integer>>result=newArrayList<>();   publicList<List<Integer>>levelOrder(TreeNoderoot){       if(root==null){           returnresult;       }       traverse(root,0);    ......
  • 【模板】多项式全家桶(多项式初等函数(部分))
    【模板】多项式初等函数同时作为https://github.com/caijianhong/template-poly的document。杂项数域为\(\mathbbF_{998244353}\),所以定义了mint为modint<998244353>。poly是多项式的类型,从std::vector<mint>继承而来。poly的构造函数如下:poly();explicitpoly(......
  • 【题解】P4722 【模板】最大流 加强版 / 预流推进
    更好阅读体验CHAPTER0废话1.常见的最大流算法可以大致分为两种:找增广路和预流推进2.从理论时间复杂度上界来看,找增广路算法的最坏时间复杂度为\(O(n^2m)\),而预流推进算法的最坏时间复杂度为\(O(n^2\sqrt{m})\),看起来预流推进要显然优于找增广路,但在实际应用(尤指OI)中,由于包......
  • (18/60)找树左下角的值、路径总和、从中序与后序遍历构造二叉树
    找树左下角的值leetcode:513.找树左下角的值层序迭代法思路层序遍历,每次更新result为每层最左侧元素。复杂度分析时间复杂度:遍历,O(N)。空间复杂度:队列层序遍历,树*似完全二叉树时O(N),树极倾斜时O(logN)。注意点略代码实现/***Definitionforabinarytreenode.......