N-ary 题型总结

2024-09-04 13:32
文章标签 总结 题型 ary

本文主要是介绍N-ary 题型总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

N-ary题型,最近问的比较多。总结一下。

N-ary Tree Preorder Traversal

思路:跟BST的一样,preorder: current, left, right, 那么就是push 右边再push左边,N-try不一样的就是要从右边一直push,到左边;


class Solution {// preorder, current, left, right;public List<Integer> preorder(Node root) {List<Integer> list = new ArrayList<>();if(root == null) {return list;}Stack<Node> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()) {Node node = stack.pop();list.add(node.val);List<Node> children = node.children;for(int i = children.size() - 1; i >= 0; i--) {stack.push(children.get(i));}}return list;}
}

N-ary Tree Postorder Traversal

Pre-order is: current, left, right;

our goal is: left, right, current.

we can do: current, right, left. 这里就是先push left,再push right,就是答案;加的时候逆序加就可以了。

 反过来就是: left, right, current,

用linkedlist addfirst,就是逆序加result,这样就可以是答案了;

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {List<Integer> list = new LinkedList<Integer>();Stack<Node> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()) {Node node = stack.pop();if(node != null) {list.add(0, node.val);for(int i = 0; i < node.children.size(); i++) {stack.push(node.children.get(i));}}}return list;}
}

N-ary Tree Level Order Traversal 就是一个Queue的level order traverse;

class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> lists = new ArrayList<List<Integer>>();if(root == null) {return lists;}Queue<Node> queue = new LinkedList<Node>();queue.offer(root);while(!queue.isEmpty()) {int size = queue.size();List<Integer> list = new ArrayList<Integer>();for(int i = 0; i < size; i++) {Node node = queue.poll();list.add(node.val);for(Node child: node.children) {queue.offer(child);}}lists.add(list);}return lists;}
}

Maximum Depth of N-ary Tree DFS, divide and conquer,每次计算下面返回上来的最大值,然后最大值+ 1;

class Solution {public int maxDepth(Node root) {if(root == null) {return 0;}int depth = 0;for(Node child: root.children) {depth = Math.max(depth, maxDepth(child));}return depth + 1;}
}

BFS Level order

class Solution {public int maxDepth(Node root) {if(root == null) {return 0;}Queue<Node> queue = new LinkedList<Node>();queue.offer(root);int depth = 0;while(!queue.isEmpty()) {int size = queue.size();for(int i = 0; i < size; i++) {Node node = queue.poll();for(Node child: node.children) {queue.offer(child);}}depth++;}return depth;}
}

 Serialize and Deserialize N-ary Tree 做这个题目之前,先明白 Serialize and Deserialize Binary Tree 和 Serialize and Deserialize BST 区别和异同,Serialize and Deserialize Binary Tree 因为是BT,没有相互之前的大小关系,所以要serialize full tree,连NULL都要serialize进去,但是BST不同,BST有左右的大小关系,所以只用serialize 有value的node就行,两个都是用queue来serialize,然后用queue来build。N-ary Tree跟BT不同的是,他有children;不能用preorder去serilize,只能用level order去serilize。不同的是,N-ary后面有child的size信息,我们也serilize进去,那么desrilize的时候,用两个queue,一个存当前node的queue,一个存node的child size信息,那么,如果size是n,那么后面2 * n个string (node + child size),都是当前node的child;每个node都有自己的child信息;Serilize用level order,(跟BT不一样, BT是用)一行一行的serilize,deserilize也是一层一层的build;

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Codec {// Encodes a tree to a single string.private String NULL = "NULL";private String DILIMITER = ",";public String serialize(Node root) {if(root == null) {return NULL;}StringBuilder sb = new StringBuilder();Queue<Node> queue = new LinkedList<Node>();queue.offer(root);while(!queue.isEmpty()) {Node head = queue.poll();sb.append(head.val).append(DILIMITER).append(head.children.size()).append(DILIMITER);for(Node child: head.children) {queue.offer(child);}}return sb.toString();}// Decodes your encoded data to tree.public Node deserialize(String data) {if(data == null || data.equals(NULL)) {return null;}String[] splits = data.split(DILIMITER);Queue<Node> nqueue = new LinkedList<Node>();Queue<Integer> cqueue = new LinkedList<Integer>();Node root = new Node(Integer.parseInt(splits[0]));int size = Integer.parseInt(splits[1]);nqueue.offer(root);cqueue.offer(size);int index = 2;while(!nqueue.isEmpty()) {Node node = nqueue.poll();int nsize = cqueue.poll();node.children = new ArrayList<Node>();for(int i = 0; i < nsize; i++) {Node newnode = new Node(Integer.parseInt(splits[index++]));int newsize = Integer.parseInt(splits[index++]);node.children.add(newnode);nqueue.offer(newnode);cqueue.offer(newsize);}}return root;}
}// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

这篇关于N-ary 题型总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136147

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自