当前位置: 首页 > news >正文

【LeetCode】589.N叉树的前序遍历(递归+迭代,java实现,详细分析)

题目

地址:

image-20200627103320228

分析

方法一:递归

代码:

class Solution {
     List<Integer> list =new ArrayList<>();
    public List<Integer> preorder(Node root) {
     
        helper(root);
        return list;
    }
    private void helper(Node root){
        if(root == null) return;
        list.add(root.val);
        for(int i=0;i<root.children.size();i++)
            helper(root.children.get(i));
        return ;
    }
}

方法二:迭代

由于递归实现 N 叉树的前序遍历较为简单,因此我们只讲解如何使用迭代的方法得到 N 叉树的前序遍历。

我们使用一个栈来帮助我们得到前序遍历,需要保证栈顶的节点就是我们当前遍历到的节点。我们首先把根节点入栈,因为根节点是前序遍历中的第一个节点。随后每次我们从栈顶取出一个节点 u,它是我们当前遍历到的节点,并把 u 的所有子节点逆序推入栈中。例如 u 的子节点从左到右为 v1, v2, v3,那么推入栈的顺序应当为 v3, v2, v1,这样就保证了下一个遍历到的节点(即 u 的第一个子节点 v1)出现在栈顶的位置。

实现1:

class Solution {
    public List<Integer> preorder(Node root) {
        LinkedList<Node> stack = new LinkedList<>();
        LinkedList<Integer> output = new LinkedList<>();
        if (root == null) {
            return output;
        }

        stack.add(root);
        while (!stack.isEmpty()) {
            Node node = stack.pollLast();
            output.add(node.val);
            Collections.reverse(node.children);
            for (Node item : node.children) {
                stack.add(item);
            }
        }
        return output;
    }
}

实现2:

public List<Integer> preorder2(Node root) {
    List<Integer> res = new ArrayList<>();
    if (root == null) return res;
    Stack<Node> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        Node cur = stack.pop();
        //头结点加入结果集
        res.add(cur.val);
        //将该节点的子节点从右往左压入栈
        for (int i = cur.children.size() - 1; i >= 0; i--) {
            stack.push(cur.children.get(i));
        }
    }
    return res;
}

相关文章:

  • 【LeetCode】429.N叉树的层序遍历(图文详解,三种方法,java实现)
  • 【LeetCode】648.单词替换(前缀树多种解法,java实现)
  • 【LeetCode】421. 数组中两个数的最大异或值(哈希集合,字典树,详细图文解释)
  • 【LeetCode】200.岛屿数量(dfs+bfs+并查集,超详细图文解释)
  • python实现强智科技教务系统抢课(两种方法)
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • 【LeetCode】279.完全平方数(四种方法,不怕不会!开拓思维)
  • 【LeetCode】739.每日温度(5种方法,详细图解)
  • 【LeetCode】733.图像渲染(深度优先搜索,java实现)
  • 【LeetCode】56.合并区间(贪心算法,java实现)
  • 【LeetCode】旋转矩阵(原地选择+翻转两种方法,java实现)
  • 计算机基础(一):二进制详解
  • 计算机基础(二):压缩算法
  • 计算机基础(四):控制硬件
  • 【LeetCode】5.最长回文子串(中心扩散法,动态规划,超详细图文,java实现)
  • Apache的80端口被占用以及访问时报错403
  • If…else
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Javascript编码规范
  • PAT A1092
  • SQL 难点解决:记录的引用
  • Vim 折腾记
  • Vue--数据传输
  • webpack入门学习手记(二)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 阿里云API、SDK和CLI应用实践方案
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (编译到47%失败)to be deleted
  • (四)c52学习之旅-流水LED灯
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)为什么要选择C++
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)http-server应用
  • (转)程序员疫苗:代码注入
  • .net FrameWork简介,数组,枚举
  • .NET 中让 Task 支持带超时的异步等待
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net快速开发框架源码分享
  • .NET是什么
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /etc/shadow字段详解
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @我的前任是个极品 微博分析
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++] new和delete
  • [C++基础]-入门知识