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

LintCode第1526-N叉树的前序遍历

描述

给定一个 N 叉树,返回其节点值的前序遍历

样例

输入 : {1,3,2,4#2#3,5,6#4#5#6}
输出: [1,3,5,6,2,4]

这棵树如下所示(左侧的)

图片

思路:该题使用递归法或者迭代法

方法1:递归法

代码如下:

/**

 * Definition for Undirected graph.

 * class UndirectedGraphNode {

 *     int label;

 *     List<UndirectedGraphNode> neighbors;

 *     UndirectedGraphNode(int x) {

 *         label = x;

 *         neighbors = new ArrayList<UndirectedGraphNode>();

 *     }

 * }

 */

public class Solution {

    /**

     * @param root: the tree

     * @return: pre order of the tree

     */

     List<Integer> returnIntegerList=new ArrayList<>();

     Set<UndirectedGraphNode> visited = new HashSet<>();//防止回边 这个属于可选项 可以将N叉树扩展到无向图 

    public List<Integer> preorder(UndirectedGraphNode root) {

        // write your code here

        returnIntegerList.clear(); // 清空上次的结果

        visited.clear();//清空访问的结果 对于多次调用preorder是必不可少的

        preOrderDFS(root);

        return returnIntegerList;

    }

    public void preOrderDFS(UndirectedGraphNode node)

    {

        if(node==null|| visited.contains(node))

        {

            return;

        }

        visited.add(node); // 标记为访问过

        returnIntegerList.add(node.label);

        for(UndirectedGraphNode neighborNode:node.neighbors)

        {

            preOrderDFS(neighborNode);

        }

       

       

    }

}

迭代法:

代码如下:

/**

 * Definition for Undirected graph.

 * class UndirectedGraphNode {

 *     int label;

 *     List<UndirectedGraphNode> neighbors;

 *     UndirectedGraphNode(int x) {

 *         label = x;

 *         neighbors = new ArrayList<UndirectedGraphNode>();

 *     }

 * }

 */

public List<Integer> preorder(UndirectedGraphNode root) {

    List<Integer> res = new ArrayList<>();

    if (root == null) return res;

    Set<UndirectedGraphNode> visited = new HashSet<>();

    Deque<UndirectedGraphNode> stack = new ArrayDeque<>();

    stack.push(root);

    while (!stack.isEmpty()) {

        UndirectedGraphNode node = stack.pop();

        if (!visited.add(node))

        {

            continue; // 已访问过就跳过

        }

        res.add(node.label); // 前序:先访问自己

        // 为保证和递归一样的“从左到右”顺序,这里反向入栈 由于栈有先进后出的特性 所以需要反转

        List<UndirectedGraphNode> ns = node.neighbors;

        for (int i = ns.size() - 1; i >= 0; i--) {

            stack.push(ns.get(i));

        }

    }

    return res;

}

http://www.lryc.cn/news/618964.html

相关文章:

  • RabbitMQ面试精讲 Day 20:RabbitMQ压测与性能评估
  • 【游戏优化笔记】开发中如何减少建筑和树木等环境元素的资源消耗?
  • 行业热点丨智能仿真时代:电子工程多物理场解决方案创新实践
  • 【盘古100Pro+开发板实验例程】FPGA学习 | 中值滤波 | 图像实验指导手册
  • Redis知识点+项目+面试八股
  • redis认识缓存击穿
  • Flutter UI Kits by Olayemi Garuba:免费开源的高质量UI组件库
  • Element用法---Loading 加载
  • React 腾讯面试手写题
  • Photoshop软件打开WebP文件格的操作教程
  • 第六十四章:AI的“觅食”之路:数据采集器设计与多源数据获取
  • Android性能优化:架构层面的性能考量
  • Android 引导式访问(屏幕固定 Screen Pinning)完整指南
  • CPPIO流
  • 北京JAVA基础面试30天打卡08
  • 信号反射规律
  • [激光原理与应用-254]:理论 - 几何光学 - 自动对焦的原理
  • W5500之“socket.c”中的相关函数
  • Vue接口平台小功能——发送报告到飞书
  • AWT与Swing深度对比:架构差异、迁移实战与性能优化
  • Unity数据可视化图表插件XCharts
  • Elasticsearch JS 自定义 ConnectionPool / Connection / Serializer、敏感信息脱敏与 v8 平滑迁移
  • python调研本地 DeepSeek API的例子
  • NLP—词向量转换评论学习项目分析真实案例
  • 【Vue 3 响应式系统深度解析:reactive vs ref 全面对比】
  • 【实时Linux实战系列】基于RFID的实时资产追踪系统
  • 当赞美来敲门:优雅接纳的艺术
  • 21.Linux HTTPS服务
  • GitHub的简单使用方法----(5)
  • 文件IO的学习