将 N 叉树编码为二叉树

作者:Grey

原文地址:

博客园:将 N 叉树编码为二叉树

CSDN:将 N 叉树编码为二叉树

题目描述

将一棵n叉树编码为一棵二叉树,并对二叉树进行解码,得到原始的n叉树。 n叉树是一棵有根树,其中每个节点的子树不超过n个。 类似地,二叉树是一棵有根树,其中每个节点的子树不超过2个。 编码/解码算法的工作方式不受限制。 您只需要确保一个n叉树可以被编码为一个二叉树,并且这个二叉树可以被解码为原始的n叉树结构。

题目链接:LintCode 1530 · Encode N-ary Tree to Binary Tree

一棵 N 叉树的示例如下

二叉树的数据结构如下

class TreeNode {public int val;public TreeNode left, right;public TreeNode(int val) {this.val = val;this.left = this.right = null;}
}

N 叉树的数据结构如下

class UndirectedGraphNode {int label;List<UndirectedGraphNode> neighbors;UndirectedGraphNode(int x) {label = x;neighbors = new ArrayList<UndirectedGraphNode>();}
}

每个节点有属于自己的 label 值,也有若干个孩子节点,即List<UndirectedGraphNode> neighbors

我们需要实现如下两个方法

// N 叉树编码成 二叉树
TreeNode encode(UndirectedGraphNode root)
// 二叉树编码成 N 叉树
UndirectedGraphNode decode(TreeNode root)

主要思路

N 叉树编码成二叉树的方法是将 N 叉树中每个节点的子节点转换成自己左树的右边界或者右树的左边界,示例图如下

二叉树编码成 N 叉树的方法就是把每个节点的左树右边界存到一个 List 里面,作为这个节点的子节点列表即可,就是上述示例图的逆过程。

N 叉树编码成二叉树的过程就是一个深度优先遍历,首先

TreeNode head = new TreeNode(root.label);

表示二叉树的根节点就是 N 叉树的根节点,

然后将根节点的孩子节点,调用递归,进行深度优先遍历,代码如下

// 将某个节点的孩子节点挂在其右树的左边界上
// 将 N 叉树的根节点的孩子节点做深度优先遍历
// 并将其挂在根节点的右树上
head.right = en(root.neighbors);// 深度优先遍历
private TreeNode en(List<UndirectedGraphNode> neighbors) {TreeNode c = null;TreeNode head = null;for (UndirectedGraphNode neighbor : neighbors) {TreeNode node = new TreeNode(neighbor.label);if (head == null) {// 头节点为空,建出来head = node;} else {// 否则挂在当前节点的右树的左边界上c.left = node;}c = node;c.right = en(neighbor.neighbors);}return head;
}

将二叉树转换成 N 叉树的逻辑如下:

首先

UndirectedGraphNode node = new UndirectedGraphNode(root.val);

表示:N 叉树的根节点也是二叉树的根节点。

接着调用递归,将二叉树的右树构造出 N 叉树当前节点的孩子节点。

// 将二叉树的右树构造出 N 叉树当前节点的孩子节点
node.neighbors = de(root.right);public ArrayList<UndirectedGraphNode> de(TreeNode root) {ArrayList<UndirectedGraphNode> children = new ArrayList<>();while (root != null) {UndirectedGraphNode cur = new UndirectedGraphNode(root.val);cur.neighbors = de(root.right);children.add(cur);root = root.left;}return children;
}

其中 while 循环中就是不断的把当前节点的左树右边界加入到一个 List 中,最后返回。

完整代码如下

public class Solution {public UndirectedGraphNode decode(TreeNode root) {if (root == null) {return null;}UndirectedGraphNode node = new UndirectedGraphNode(root.val);node.neighbors = de(root.right);return node;}public ArrayList<UndirectedGraphNode> de(TreeNode root) {ArrayList<UndirectedGraphNode> children = new ArrayList<>();while (root != null) {UndirectedGraphNode cur = new UndirectedGraphNode(root.val);cur.neighbors = de(root.right);children.add(cur);root = root.left;}return children;}// 每个子节点转换成自己左树的右边界或者右树的左边界 + 深度优先遍历// 编码public TreeNode encode(UndirectedGraphNode root) {if (root == null) {return null;}TreeNode head = new TreeNode(root.label);// 右树的左边界head.right = en(root.neighbors);return head;}private TreeNode en(List<UndirectedGraphNode> neighbors) {TreeNode c = null;TreeNode head = null;for (UndirectedGraphNode neighbor : neighbors) {TreeNode node = new TreeNode(neighbor.label);if (head == null) {// 头节点为空,建出来head = node;} else {// 否则挂在当前节点的右树的左边界上c.left = node;}c = node;c.right = en(neighbor.neighbors);}return head;}
}

本文涉及到的所有图例见:二叉树与N叉树的互相转换

更多

算法和数据结构笔记

将 N 叉树编码为二叉树相关推荐

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

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 BFS 1. 题目 设计一个算法,可以将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树. 一个 N 叉树是指每个节点都有不超过 N 个 ...

  2. Leetcode431.将N叉树编码为二叉树(golang)

    思路简述 一道困难题,是一道偏设计类的题目,首先第一个困难点就是如何用二叉树来表示一颗N叉树,其中一种可行常见的思想是:二叉树中节点的左子树为原N叉树中的孩子,右子树为原N叉树中的兄弟节点,下面是一个 ...

  3. 43-二叉树练习-LeetCode236二叉树的最近公共祖先

    题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x 是 p.q 的 ...

  4. C语言六叉树,递归创建二叉树c语言实现+详细解释

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void CreatBiTree(BiTree T) { char a; scanf("%c",&a); if(a=='@') ...

  5. 【算法笔记】二叉树之基础遍历

    基础知识 一. 二叉树的种类 二叉树主要分为满二叉树.完全二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树.深度为k的满二叉树,有2k ...

  6. leetcode刷题目录总结

    题目 题目 技巧 相似的题目 其他 1. 无序数组中找出目标为target的两个数 先定义下一个数,然后找两位的数是否存在 高频, 大厂刷题班, 第27节 2.逆序链表两数相加 链表.各位加法 高频, ...

  7. 如何学好C语言--你的学渣朋友告诉你

    光说不练假把式,光练不说傻把式,又练又说真把式. 真实感受,不是我不想学,是我真的不知道我哪里不会啊和得怎么做啊?本文作者当初就是这么废掉的 推荐两个练习的网站 (一)C语言网 https://www ...

  8. LeetCode1-620题汇总,希望对你有点帮助!

    时间很快,公众号发布的LeetCode题目,已经达到620道题了.今天把发布的1-620篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的, ...

  9. LeetCode1-580题汇总,希望对你有点帮助!

    时间很快,公众号发布的LeetCode题目,已经达到560道题了.今天把发布的1-560篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的, ...

  10. 【Leetcode】431. Encode N-ary Tree to Binary Tree(困难)

    一.题目 1.题目描述 Design an algorithm to encode an N-ary tree into a binary tree and decode the binary tre ...

最新文章

  1. python字符串压缩字_gzip如何在Python中压缩字符串?
  2. python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...
  3. Dataset之UT Zappos50K:UT Zappos50K数据集的简介、安装、使用方法之详细攻略
  4. 【maven】使用(阿里云 aliyun)镜像仓库
  5. ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口
  6. go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态
  7. java正则表达式面试_【Java面试宝典】正则表达式
  8. TCP 协议(包含三次握手,四次挥手)
  9. 第10章 项目干系人管理
  10. AutoK3s v0.4.8 发布 与 Harvester 梦幻联动
  11. 空调弱周期到了!海尔发力空气网,线上线下唯一双增长
  12. ElasticSearch基础教程
  13. Text组件新增内容通过tag_config设置前景色、背景色
  14. JAVA版APP社交移动电商系统+短视频+直播+线下店+营销活动+社交支持二开
  15. 如何退出SCALA命令界面
  16. 地铁两站之间最短路径查询(python实现)
  17. ecu故障现象_汽车电脑ECU的故障诊断检修方法9种
  18. matlab生成一个数值一样的向量
  19. Java中调用C++代码
  20. inventor2五子棋游戏apk_联机五子棋手机版下载|联机五子棋游戏下载v1.3.2 安卓版_ 单机手游网...

热门文章

  1. Linux自学day2
  2. 开源微信共享记账小程序
  3. Navicat15 安装激活
  4. 【计算机网络自顶向下方法】深入理解计算机网络分层和封装模型
  5. 0x80070079信号灯超时_onedrive下载文件时,出现”0x80070079信号灯超时时间已到”...
  6. OPPO A57刷机 A57刷机包下载 纯净包 A57T忘记密码 帐号解锁 刷机教程 精简Rom刷机包
  7. 操作系统形式化验证实践教程(1) - 证明第一个定理
  8. kafka下载与安装教程
  9. 谷歌浏览器如何安装插件-以octotree为例
  10. QGIS教程—缓冲区buffer