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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern