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 多叉树和二叉树互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解DES加密算法及在Java程序中的使用示例

    详解DES加密算法及在Java程序中的使用示例

    这篇文章主要介绍了详解DES加密算法及在Java程序中的使用示例,文中还有一个用Java实现的DES三重加密的例子,需要的朋友可以参考下
    2016-04-04
  • spring boot ajax跨域的两种方式

    spring boot ajax跨域的两种方式

    java语言在多数时,会作为一个后端语言,为前端的php,node.js等提供API接口。这篇文章主要介绍了spring boot ajax跨域的两种方式,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • Spring中@Conditional注解的详细讲解及示例

    Spring中@Conditional注解的详细讲解及示例

    这篇文章主要介绍了Spring中@Conditional注解的详细讲解及示例,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,需要的朋友可以参考下
    2023-11-11
  • JAVA中的动态代理使用详解

    JAVA中的动态代理使用详解

    这篇文章主要介绍了JAVA中的动态代理使用详解,动态代理提供了一种灵活且非侵入式的方式,可以对对象的行为进行定制和扩展,它在代码重用、解耦和业务逻辑分离、性能优化以及系统架构中起到了重要的作用,,需要的朋友可以参考下
    2023-08-08
  • 简述Springboot @Async 异步方法

    简述Springboot @Async 异步方法

    这篇文章主要介绍了Springboot @Async 异步方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • Bloc事件流是一个阻塞队列结论解析

    Bloc事件流是一个阻塞队列结论解析

    这篇文章主要为大家介绍了Bloc事件流是一个阻塞队列结论解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java 正则表达式详细介绍

    Java 正则表达式详细介绍

    本文主要介绍 Java 正则表达式的内容,这里整理了Java 正则表达式的相关资料,并详细介绍,附有代码示例,有兴趣的小伙伴可以参考下
    2016-09-09
  • idea代码模板设置方式

    idea代码模板设置方式

    这篇文章主要介绍了idea代码模板设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java服务cpu100%的解决过程分享

    Java服务cpu100%的解决过程分享

    最近一个任务是优化一个导出的功能,但是点击功能时发现,程序长时间无反应,过一段时间又有反应,通过查看服务的监控发现,服务存在cpu持续100%的情况,下面分享一下我的处理方案和过程,需要的朋友可以参考下
    2024-05-05
  • Ribbon的饥饿加载(eager-load)模式解读

    Ribbon的饥饿加载(eager-load)模式解读

    这篇文章主要介绍了Ribbon的饥饿加载(eager-load)模式解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论