Java实现多叉树和二叉树之间的互转

 更新时间:2023年05月08日 09:52:50   作者:Java星辰  
本文主要介绍了Java实现多叉树和二叉树之间的互转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

本文主要介绍如何把一个多叉树转换成二叉树以及把二叉树还原成多叉树。

正文

给出一个多叉树,实现一个函数,这个函数可以把多叉树转成二叉树,再实现一个函数把二叉树还原成多叉树。

如下图所示,将多叉树按某种规则进行转化,转成二叉树,并且能从二叉树再按某种规则还原回来。

思路分析

这道题类似于多叉树的序列化和反序列化,不同的是把多叉树序列化成二叉树,反序列化是从二叉树还原成多叉树。

本题是力扣上的一道付费题目,虽然标记的是困难型的题目,但是说难的话也不是很难,下面来看下具体思路。

本道题只是说按某种规则,并没有明确指明使用什么规则,所以我们制定一个规则就好了。

转成二叉树规则,可以制定如下规则:

  • 将多叉树中任意一个节点x的所有子节点,转为节点x的左子树的右边界。

以下图为例,节点a3个子节点,在转化二叉树后,节点a只有一个左孩子b,而b有一个有孩子cc有一个右孩子d

同样的节点b的子节点e、f转化之后,节点e节点b的左孩子,节点f节点e的右孩子。

转化结果为下图所示。

如何还原呢?还原就是转二叉树的逆序。判断二叉树的节点,如果节点没有左孩子那么这个节点一定是叶子节点,例如节点c节点e节点f节点g节点h节点i都叶子节点。如果一个节点有左孩子,那么这个左孩子的所有子节点,也就所有右节点都为多叉树的同级子节点。

本次分析的是将多叉树的子节点,转为二叉树的右边界,这个不是固定的,也可以是左边界、也可以是其他形式,只要能转化就可以,这里使用有边界只是举了个例子以及实现方便。

代码实现

根据上面的思路分析,来看下代码实现,首先定义一下多叉树和二叉树的节点定义,多叉树有多个子节点,多以多叉树的子节点使用集合形式表示。

// 多叉树节点定义
public class Node {
   public int val;
   // 子节点是列表形式
   public List<Node> children;
   public Node(int _val) {
      val = _val;
   }
   public Node(int _val, List<Node> _children) {
      val = _val;
      children = _children;
   }
}
// 二叉树节点定义
public class TreeNode {
   int val;
   TreeNode left;
   TreeNode right;
   TreeNode(int x) {
      val = x;
   }
}

先看下二叉树转二叉树的代码实现,该方式接收一个多叉树的头节点,返回一个二叉树的头节点:

public TreeNode encode(Node root) {
   if (root == null) {
      return null;
   }
   TreeNode head = new TreeNode(root.val);
   head.left = en(root.children);
   return head;
}
private TreeNode en(List<Node> children) {
   TreeNode head = null;
   TreeNode cur = null;
   for (Node child : children) {
      TreeNode tNode = new TreeNode(child.val);
      if (head == null) {
         head = tNode;
      } else {
         cur.right = tNode;
      }
      cur = tNode;
      cur.left = en(child.children);
   }
   return head;
}

再看下从二叉树还原为多叉树的代码实现,同样是接收一个二叉树的头节点,返回多叉树的头结点:

public Node decode(TreeNode root) {
   if (root == null) {
      return null;
   }
   return new Node(root.val, de(root.left));
}
public List<Node> de(TreeNode root) {
   List<Node> children = new ArrayList<>();
   while (root != null) {
      Node cur = new Node(root.val, de(root.left));
      children.add(cur);
      root = root.right;
   }
   return children;
}

总结

本文主要介绍如何把一个多叉树转换成二叉树以及把二叉树还原成多叉树,文中分析了多叉树和二叉树相互转化的过程,实现起来不是很难,但是需要一点技巧,在代码实现的过程中,使用了深度优先遍历。

到此这篇关于Java实现多叉树和二叉树之间的互转的文章就介绍到这了,更多相关Java 多叉树和二叉树互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Map.getOrDefault方法详解

    Java Map.getOrDefault方法详解

    Map.getOrDefault(Object key, V defaultValue)是Java中Map接口的一个方法,用于获取指定键对应的值,如果键不存在,则返回一个默认值,这篇文章主要介绍了Java Map.getOrDefault方法详解,需要的朋友可以参考下
    2024-01-01
  • 分享Java死锁的4种排查工具

    分享Java死锁的4种排查工具

    这篇文章主要介绍了分享Java死锁的4种排查工具,死锁指的是两个或两个以上的运算单元,都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁,下文更多相关内容需要的小伙伴可以参考一下
    2022-05-05
  • Netty搭建WebSocket服务器实战教程

    Netty搭建WebSocket服务器实战教程

    这篇文章主要介绍了Netty搭建WebSocket服务器实战,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Springboot如何使用Aspectj实现AOP面向切面编程

    Springboot如何使用Aspectj实现AOP面向切面编程

    这篇文章主要介绍了Springboot如何使用Aspectj实现AOP面向切面编程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring MVC中自定义拦截器的实例讲解

    Spring MVC中自定义拦截器的实例讲解

    下面小编就为大家带来一篇Spring MVC中自定义拦截器的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot实现字段自动填充的两种方式

    SpringBoot实现字段自动填充的两种方式

    每个字段在插入数据库,或者更新时都要在serviceimpl层对creatby,updateby等字段进行填充,这个太繁琐了,所以本文给大家介绍了SpringBoot实现字段自动填充的两种方式,需要的朋友可以参考下
    2024-11-11
  • 关于idea-web.xml版本过低怎么生成新的(web.xml报错)问题

    关于idea-web.xml版本过低怎么生成新的(web.xml报错)问题

    今天通过本文给大家分享idea-web.xml版本过低怎么生成新的(web.xml报错)问题,通过更换web.xml版本解决此问题,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Java ApiPost请求返回406状态码问题的解决方案

    Java ApiPost请求返回406状态码问题的解决方案

    APIPost是一款专为开发者和测试人员设计的API测试工具,类似于Postman,但提供了更多的团队协作和文档管理功能,它可以帮助你更好地进行接口调试和集成测试,但遇到了请求后返回的是406状态,所以本文给大家介绍了Java ApiPost请求返回406状态码问题的解决方案
    2025-04-04
  • SpringBoot配置MySQL5.7与MySQL8.0的异同点详解

    SpringBoot配置MySQL5.7与MySQL8.0的异同点详解

    MySQL 是 Java 开发中最常用的数据库之一,而 Spring Boot 提供了便捷的配置方式,随着 MySQL 8.0 的普及,许多开发者需要从 MySQL 5.7 升级到 8.0,在实际开发中,二者的配置方式既有相似之处,也有一些需要特别注意的不同点,所以本文给大家详细介绍了它们的异同点
    2024-12-12
  • Jpa使用Page和Pageable分页遇到的问题及解决

    Jpa使用Page和Pageable分页遇到的问题及解决

    这篇文章主要介绍了Jpa使用Page和Pageable分页遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论