最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)多叉樹(shù)和二叉樹(shù)之間的互轉(zhuǎn)

 更新時(shí)間:2023年05月08日 09:52:50   作者:Java星辰  
本文主要介紹了Java實(shí)現(xiàn)多叉樹(shù)和二叉樹(shù)之間的互轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

本文主要介紹如何把一個(gè)多叉樹(shù)轉(zhuǎn)換成二叉樹(shù)以及把二叉樹(shù)還原成多叉樹(shù)。

正文

給出一個(gè)多叉樹(shù),實(shí)現(xiàn)一個(gè)函數(shù),這個(gè)函數(shù)可以把多叉樹(shù)轉(zhuǎn)成二叉樹(shù),再實(shí)現(xiàn)一個(gè)函數(shù)把二叉樹(shù)還原成多叉樹(shù)。

如下圖所示,將多叉樹(shù)按某種規(guī)則進(jìn)行轉(zhuǎn)化,轉(zhuǎn)成二叉樹(shù),并且能從二叉樹(shù)再按某種規(guī)則還原回來(lái)。

思路分析

這道題類(lèi)似于多叉樹(shù)的序列化和反序列化,不同的是把多叉樹(shù)序列化成二叉樹(shù),反序列化是從二叉樹(shù)還原成多叉樹(shù)。

本題是力扣上的一道付費(fèi)題目,雖然標(biāo)記的是困難型的題目,但是說(shuō)難的話(huà)也不是很難,下面來(lái)看下具體思路。

本道題只是說(shuō)按某種規(guī)則,并沒(méi)有明確指明使用什么規(guī)則,所以我們制定一個(gè)規(guī)則就好了。

轉(zhuǎn)成二叉樹(shù)規(guī)則,可以制定如下規(guī)則:

  • 將多叉樹(shù)中任意一個(gè)節(jié)點(diǎn)x的所有子節(jié)點(diǎn),轉(zhuǎn)為節(jié)點(diǎn)x的左子樹(shù)的右邊界。

以下圖為例,節(jié)點(diǎn)a3個(gè)子節(jié)點(diǎn),在轉(zhuǎn)化二叉樹(shù)后,節(jié)點(diǎn)a只有一個(gè)左孩子b,而b有一個(gè)有孩子c,c有一個(gè)右孩子d。

同樣的節(jié)點(diǎn)b的子節(jié)點(diǎn)e、f轉(zhuǎn)化之后,節(jié)點(diǎn)e節(jié)點(diǎn)b的左孩子,節(jié)點(diǎn)f節(jié)點(diǎn)e的右孩子。

轉(zhuǎn)化結(jié)果為下圖所示。

如何還原呢?還原就是轉(zhuǎn)二叉樹(shù)的逆序。判斷二叉樹(shù)的節(jié)點(diǎn),如果節(jié)點(diǎn)沒(méi)有左孩子那么這個(gè)節(jié)點(diǎn)一定是葉子節(jié)點(diǎn),例如節(jié)點(diǎn)c、節(jié)點(diǎn)e、節(jié)點(diǎn)f節(jié)點(diǎn)g、節(jié)點(diǎn)h、節(jié)點(diǎn)i都葉子節(jié)點(diǎn)。如果一個(gè)節(jié)點(diǎn)有左孩子,那么這個(gè)左孩子的所有子節(jié)點(diǎn),也就所有右節(jié)點(diǎn)都為多叉樹(shù)的同級(jí)子節(jié)點(diǎn)。

本次分析的是將多叉樹(shù)的子節(jié)點(diǎn),轉(zhuǎn)為二叉樹(shù)的右邊界,這個(gè)不是固定的,也可以是左邊界、也可以是其他形式,只要能轉(zhuǎn)化就可以,這里使用有邊界只是舉了個(gè)例子以及實(shí)現(xiàn)方便。

代碼實(shí)現(xiàn)

根據(jù)上面的思路分析,來(lái)看下代碼實(shí)現(xiàn),首先定義一下多叉樹(shù)和二叉樹(shù)的節(jié)點(diǎn)定義,多叉樹(shù)有多個(gè)子節(jié)點(diǎn),多以多叉樹(shù)的子節(jié)點(diǎn)使用集合形式表示。

// 多叉樹(shù)節(jié)點(diǎn)定義
public class Node {
   public int val;
   // 子節(jié)點(diǎn)是列表形式
   public List<Node> children;
   public Node(int _val) {
      val = _val;
   }
   public Node(int _val, List<Node> _children) {
      val = _val;
      children = _children;
   }
}
// 二叉樹(shù)節(jié)點(diǎn)定義
public class TreeNode {
   int val;
   TreeNode left;
   TreeNode right;
   TreeNode(int x) {
      val = x;
   }
}

先看下二叉樹(shù)轉(zhuǎn)二叉樹(shù)的代碼實(shí)現(xiàn),該方式接收一個(gè)多叉樹(shù)的頭節(jié)點(diǎn),返回一個(gè)二叉樹(shù)的頭節(jié)點(diǎn):

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;
}

再看下從二叉樹(shù)還原為多叉樹(shù)的代碼實(shí)現(xiàn),同樣是接收一個(gè)二叉樹(shù)的頭節(jié)點(diǎn),返回多叉樹(shù)的頭結(jié)點(diǎn):

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;
}

總結(jié)

本文主要介紹如何把一個(gè)多叉樹(shù)轉(zhuǎn)換成二叉樹(shù)以及把二叉樹(shù)還原成多叉樹(shù),文中分析了多叉樹(shù)和二叉樹(shù)相互轉(zhuǎn)化的過(guò)程,實(shí)現(xiàn)起來(lái)不是很難,但是需要一點(diǎn)技巧,在代碼實(shí)現(xiàn)的過(guò)程中,使用了深度優(yōu)先遍歷。

到此這篇關(guān)于Java實(shí)現(xiàn)多叉樹(shù)和二叉樹(shù)之間的互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)Java 多叉樹(shù)和二叉樹(shù)互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Map.getOrDefault方法詳解

    Java Map.getOrDefault方法詳解

    Map.getOrDefault(Object key, V defaultValue)是Java中Map接口的一個(gè)方法,用于獲取指定鍵對(duì)應(yīng)的值,如果鍵不存在,則返回一個(gè)默認(rèn)值,這篇文章主要介紹了Java Map.getOrDefault方法詳解,需要的朋友可以參考下
    2024-01-01
  • 分享Java死鎖的4種排查工具

    分享Java死鎖的4種排查工具

    這篇文章主要介紹了分享Java死鎖的4種排查工具,死鎖指的是兩個(gè)或兩個(gè)以上的運(yùn)算單元,都在等待對(duì)方停止執(zhí)行,以取得系統(tǒng)資源,但是沒(méi)有一方提前退出,就稱(chēng)為死鎖,下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Netty搭建WebSocket服務(wù)器實(shí)戰(zhàn)教程

    Netty搭建WebSocket服務(wù)器實(shí)戰(zhàn)教程

    這篇文章主要介紹了Netty搭建WebSocket服務(wù)器實(shí)戰(zhàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程

    Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程

    這篇文章主要介紹了Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring MVC中自定義攔截器的實(shí)例講解

    Spring MVC中自定義攔截器的實(shí)例講解

    下面小編就為大家?guī)?lái)一篇Spring MVC中自定義攔截器的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • SpringBoot實(shí)現(xiàn)字段自動(dòng)填充的兩種方式

    SpringBoot實(shí)現(xiàn)字段自動(dòng)填充的兩種方式

    每個(gè)字段在插入數(shù)據(jù)庫(kù),或者更新時(shí)都要在serviceimpl層對(duì)creatby,updateby等字段進(jìn)行填充,這個(gè)太繁瑣了,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)字段自動(dòng)填充的兩種方式,需要的朋友可以參考下
    2024-11-11
  • 關(guān)于idea-web.xml版本過(guò)低怎么生成新的(web.xml報(bào)錯(cuò))問(wèn)題

    關(guān)于idea-web.xml版本過(guò)低怎么生成新的(web.xml報(bào)錯(cuò))問(wèn)題

    今天通過(guò)本文給大家分享idea-web.xml版本過(guò)低怎么生成新的(web.xml報(bào)錯(cuò))問(wèn)題,通過(guò)更換web.xml版本解決此問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java ApiPost請(qǐng)求返回406狀態(tài)碼問(wèn)題的解決方案

    Java ApiPost請(qǐng)求返回406狀態(tài)碼問(wèn)題的解決方案

    APIPost是一款專(zhuān)為開(kāi)發(fā)者和測(cè)試人員設(shè)計(jì)的API測(cè)試工具,類(lèi)似于Postman,但提供了更多的團(tuán)隊(duì)協(xié)作和文檔管理功能,它可以幫助你更好地進(jìn)行接口調(diào)試和集成測(cè)試,但遇到了請(qǐng)求后返回的是406狀態(tài),所以本文給大家介紹了Java ApiPost請(qǐng)求返回406狀態(tài)碼問(wèn)題的解決方案
    2025-04-04
  • SpringBoot配置MySQL5.7與MySQL8.0的異同點(diǎn)詳解

    SpringBoot配置MySQL5.7與MySQL8.0的異同點(diǎn)詳解

    MySQL 是 Java 開(kāi)發(fā)中最常用的數(shù)據(jù)庫(kù)之一,而 Spring Boot 提供了便捷的配置方式,隨著 MySQL 8.0 的普及,許多開(kāi)發(fā)者需要從 MySQL 5.7 升級(jí)到 8.0,在實(shí)際開(kāi)發(fā)中,二者的配置方式既有相似之處,也有一些需要特別注意的不同點(diǎn),所以本文給大家詳細(xì)介紹了它們的異同點(diǎn)
    2024-12-12
  • Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決

    Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決

    這篇文章主要介紹了Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

巴塘县| 桐乡市| 万全县| 吉林省| 汾西县| 正安县| 彭州市| 鄂尔多斯市| 宁晋县| 普宁市| 五原县| 蓝山县| 徐水县| 横峰县| 收藏| 上虞市| 宁安市| 交城县| 扶沟县| 红原县| 凌海市| 饶河县| 福贡县| 剑川县| 兰州市| 连江县| 江陵县| 濮阳市| 遂川县| 平南县| 太和县| 永兴县| 瑞安市| 广灵县| 综艺| 莫力| 河间市| 阿克| 石阡县| 东平县| 微博|