当前位置: 首页 > 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.dtcms.com/a/327944.html

相关文章:

  • MongoDB 入门指南(一):从 0 到 1 学会文档数据库
  • QT之问题解决记录1:上下位机通信中断而不自知
  • react+redux+toolkit来实现公共数据的处理-对比vuex
  • 深度学习日志及可视化过程
  • 【机器学习深度学习】归一化层
  • Java 编程每日一题:实现一个简易的 LRU 缓存
  • JavaSE:数据类型与变量
  • 13-docker的轻量级私有仓库之docker-registry
  • 网络安全第1—2天笔记
  • 【19】万集科技——万集科技嵌入式,校招 一面,二面,面试问答记录
  • 数据分析与可视化
  • Unity数据可视化图表插件XCharts
  • CS2服务器是何方神圣
  • 21.Linux HTTPS服务
  • imx6ull-驱动开发篇20——linux互斥体实验
  • mimiconda+vscode
  • Ceph的FileStore存储引擎详解
  • Ceph放置组(PG)详解
  • 石头剪刀布手势识别数据集-3,100 张图片 智能游戏系统 人机交互界面 教育娱乐应用 手势识别技术研究 实时视频分析 移动端AI应用
  • 8 反向引用
  • cartographer 后端优化流程
  • 渗透测试现已成为 CISO 战略的核心
  • @RequestMapping接收文件格式的形参(方法参数)
  • 数字孪生赋能全场景智慧化:从水利工厂到城市治理的综合解决方案
  • Akamai字符串解混淆
  • RSA各种密钥格式
  • C++ Rust与Go
  • 【taro react】 ---- 实现 RuiPaging 滚动到底部加载更多数据
  • 使用 Docker 一键部署火山引擎 Sandbox-Fusion,并开放 8182 端口
  • QT6 如何在Linux Wayland 桌面系统抓屏和分享屏幕