LeetCode 431. 将 N 叉树编码为二叉树(递归/层序)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 递归
      • 2.2 BFS

1. 题目

设计一个算法,可以将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树。
一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。
类似地,一个二叉树是指每个节点都有不超过 2 个孩子节点的有根树。
你的编码 / 解码的算法的实现没有限制,你只需要保证一个 N 叉树可以编码为二叉树且该二叉树可以解码回原始 N 叉树即可。

例如,你可以将下面的 3-叉 树以该种方式编码:

在这里插入图片描述

注意,上面的方法仅仅是一个例子,可能可行也可能不可行。
你没有必要遵循这种形式转化,你可以自己创造和实现不同的方法。

注意:
N 的范围在 [1, 1000]
不要使用类成员 / 全局变量 / 静态变量来存储状态。
你的编码和解码算法应是无状态的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/encode-n-ary-tree-to-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 参考官方思路,第一个子节点2接到父节点1的left,其余的兄弟节点 3,4 都接在其左边兄弟节点的right
    在这里插入图片描述

2.1 递归

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*//*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Codec {
public:// Encodes an n-ary tree to a binary tree.TreeNode* encode(Node* root) {if(!root) return NULL;TreeNode* newroot = new TreeNode(root->val);TreeNode* cur = NULL;if(!root->children.empty()){newroot->left = encode(root->children[0]);cur = newroot->left;}for(int i = 1; i < root->children.size(); ++i){cur->right = encode(root->children[i]);cur = cur->right;}return newroot;}// Decodes your binary tree to an n-ary tree.Node* decode(TreeNode* root) {if(!root) return NULL;Node *newroot = new Node(root->val);TreeNode *cur = NULL;if(root->left){newroot->children.push_back(decode(root->left));cur = root->left;}while(cur && cur->right){newroot->children.push_back(decode(cur->right));cur = cur->right;}return newroot;}
};

108 ms 179.4 MB

2.2 BFS

class Codec {
public:// Encodes an n-ary tree to a binary tree.TreeNode* encode(Node* root) {if(!root) return NULL;TreeNode* newroot = new TreeNode(root->val), *newTreeNode = NULL;TreeNode* cur = NULL;queue<pair<Node*, TreeNode*>> q;q.push({root,newroot});while(!q.empty()){int size = q.size();while(size--){root = q.front().first;newTreeNode = q.front().second;q.pop();if(!root->children.empty()){newTreeNode->left = new TreeNode(root->children[0]->val);cur = newTreeNode->left;q.push({root->children[0], cur});}for(int i = 1; i < root->children.size(); ++i){cur->right = new TreeNode(root->children[i]->val);;cur = cur->right;q.push({root->children[i], cur});}}}return newroot;}// Decodes your binary tree to an n-ary tree.Node* decode(TreeNode* root) {if(!root) return NULL;Node *newroot = new Node(root->val), *newNode = NULL;Node *cur = NULL;queue<pair<TreeNode*, Node*>> q;q.push({root,newroot});while(!q.empty()){int size = q.size();while(size--){root = q.front().first;cur = q.front().second;q.pop();if(root->left){newNode = new Node(root->left->val);cur->children.push_back(newNode);q.push({root->left, newNode});root = root->left;while(root->right){newNode = new Node(root->right->val);cur->children.push_back(newNode);q.push({root->right, newNode});root = root->right;}}}}return newroot;}
};

80 ms 173.6 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

包概念与__init__注意事项

1.包的概念 为了组织好模块&#xff0c;将多个模块分为一个包。包是python模块文件所在的目录&#xff0c;且该目录下必须存在__init__.py文件。常见的包结构如下&#xff1a; package_a ├── __init__.py ├── module_a1.py └── module_a2.py package_b ├── _…

服务器上有涉密文件,涉密文件保密管理规定

为贯彻落实国家和省、市、区保密局对涉密文件资料管理工作的要求&#xff0c;进一步做好我办涉密文件资料管理&#xff0c;特制定本规定。一、涉密文件的拟制、印刷、传递、承办、借阅、保管、归档、移交和销毁&#xff0c;必须严格履行审批、清点、登记、签收等手续。二、涉密…

服务器文件同步管理

服务器文件同步管理 原文 http://www.cnblogs.com/yanxiaodi/archive/2011/03/21/2296462.html 前几天有台服务器电源坏了&#xff0c;还好数据没有丢。因此必须做好服务器文件内容的备份。服务器主要是用来提供网站服务&#xff0c;带着一个数据库&#xff0c;数据库可以用分发…

LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)

文章目录1. 题目2. 解题1. 题目 假设我们在一条水平数轴上&#xff0c;列表 stations 来表示各个加油站的位置&#xff0c;加油站分别在 stations[0], stations[1], ..., stations[N-1] 的位置上&#xff0c;其中 N stations.length。 现在我们希望增加 K 个新的加油站&…

修改软件服务器json返回数据格式,AngularJS处理服务器端返回的JSON数据的格式问题...

用ng的$http服务发起ajax请求&#xff0c;php返回的JSON数据格式要正确&#xff01;一开始我的php页面是这样返回数据的&#xff1a;if($result){$oid mysqli_insert_id($conn);echo "{msg:succ,oid:$oid}";}else{echo "{msg:error}";}然后总是报错&#…

python编码规范与命名规范

编码规范 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 每行不超过80个字符&#xff0c;Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.例如&#xff1a; x (This will build a …

Linux学习笔记(4) - 文件系统

4.1 什么是文件系统 文件系统表示存储在计算机上的文件和目录的数据结构&#xff0c;也可以用于存储文件的分区或磁盘&#xff0c;操作系统通过文件系统可以方便地查询和访问其中所包含的磁盘块。在Linux系统中&#xff0c;每个分区都是一个文件系统&#xff0c;都有自己的目录…

LeetCode 644. 最大平均子段和 II(二分查找)*

文章目录1. 题目2. 解题2.1 暴力超时2.2 二分查找1. 题目 给定一个包含 n 个整数的数组&#xff0c;找到最大平均值的连续子序列&#xff0c;且长度大于等于 k。并输出这个最大平均值。 样例 1: 输入: [1,12,-5,-6,50,3], k 4 输出: 12.75 解释: 当长度为 5 的时候&#xff…

python基础学习总结

1.python历史 Guido 89年圣诞开写 91年编辑器问世 优点与缺点 优点&#xff1a;简单、易学、免费开源、高层语言 可移植、解释、面向对象、扩展 丰富库、规范代码 缺点&#xff1a;运行速度、国内市场小、中文资料少 2.模式&#xff1a;文本、交互、集成开发 程序原理&am…

学生管理系统代码赏析

# 添加、删除、显示学生信息&#xff08;保存&#xff09; # 保存所有学生信息 students {} # 创建 ID 1000 # 控制系统是否退出 flag True # 从文件中读取学生信息 def load_students(): # 加载学生信息从文件中 stu_file open("students.txt",&quo…

LeetCode 527. 单词缩写(Trie树)

文章目录1. 题目2. 解题1. 题目 给定一个由n个不重复非空字符串组成的数组&#xff0c;你需要按照以下规则为每个单词生成最小的缩写。 初始缩写由起始字母省略字母的数量结尾字母组成。若存在冲突&#xff0c;亦即多于一个单词有同样的缩写&#xff0c;则使用更长的前缀代替…

POJ 1523 SPF (割点 点双连通分量)

题意&#xff1a;求出割点以及除去割点后的连通分量的数量(附带求出了点双连通分量(块)) [求割点]对图深度优先搜索&#xff0c;定义DFS(u)为u在搜索树&#xff08;以下简称为树&#xff09;中被遍历到的次序号。定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点&…

质数——python代码赏析

一、求&#xff08;2—您输入数字&#xff09;之间的质数&#xff1a; num int(input("请输入您要输入的数字:"))a[] if num 2:a.append(2) elif num >2:for i in range(2,num1):for j in range(2,i):if i %j 0:breakelse:a.append(i)print(a) 二、求2-100之间…

LeetCode 1199. 建造街区的最短时间(优先队列贪心)

文章目录1. 题目2. 解题1. 题目 你是个城市规划工作者&#xff0c;手里负责管辖一系列的街区。在这个街区列表中 blocks[i] t 意味着第 i 个街区需要 t 个单位的时间来建造。 由于一个街区只能由一个工人来完成建造。 所以&#xff0c;一个工人要么需要再召唤一个工人&…

用Android-X86和VirtualBox打造高性能Android开发环境

现在已经采用genymotion替换下面的方法 https://www.genymotion.com转载于:https://www.cnblogs.com/sunzhuo1228/archive/2013/05/30/3109445.html

LeetCode 1088. 易混淆数 II(回溯/BFS)

文章目录1. 题目2. 解题2.1 回溯2.2 BFS1. 题目 本题我们会将数字旋转 180 来生成一个新的数字。 比如 0、1、6、8、9 旋转 180 以后&#xff0c;我们得到的新数字分别为 0、1、9、8、6。 2、3、4、5、7 旋转 180 后&#xff0c;是 无法 得到任何数字的。 易混淆数&#xf…

python——import导入模

1.import 搜索路径 import sys sys.path 路径搜索 从上⾯列出的⽬录⾥依次查找要导⼊的模块⽂件 表示当前路径 程序执⾏时导⼊模块路径 sys.path.append(/home/itcast/xxx) sys.path.insert(0, /home/itcast/xxx) #可以确保先搜索这个路径 I…

timer.schedule定时器用法

Timer是一种定时器工具&#xff0c;用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 TimerTask一个抽象类&#xff0c;它的子类代表一个可以被Timer计划的任务。 schedule的意思&#xff08;时间表、进度表&#xff09; timer.schedule(new MyTas…

LeetCode 759. 员工空闲时间(排序)

文章目录1. 题目2. 解题1. 题目 给定员工的 schedule 列表&#xff0c;表示每个员工的工作时间。 每个员工都有一个非重叠的时间段 Intervals 列表&#xff0c;这些时间段已经排好序。 返回表示 所有 员工的 共同&#xff0c;正数长度的空闲时间 的有限时间段的列表&#xf…