欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)多叉樹和二叉樹之間的互轉

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

前言

本文主要介紹如何把一個多叉樹轉換成二叉樹以及把二叉樹還原成多叉樹。

正文

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

如下圖所示,將多叉樹按某種規(guī)則進行轉化,轉成二叉樹,并且能從二叉樹再按某種規(guī)則還原回來。

思路分析

這道題類似于多叉樹的序列化和反序列化,不同的是把多叉樹序列化成二叉樹,反序列化是從二叉樹還原成多叉樹。

本題是力扣上的一道付費題目,雖然標記的是困難型的題目,但是說難的話也不是很難,下面來看下具體思路。

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

轉成二叉樹規(guī)則,可以制定如下規(guī)則:

  • 將多叉樹中任意一個節(jié)點x的所有子節(jié)點,轉為節(jié)點x的左子樹的右邊界。

以下圖為例,節(jié)點a3個子節(jié)點,在轉化二叉樹后,節(jié)點a只有一個左孩子b,而b有一個有孩子cc有一個右孩子d。

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

轉化結果為下圖所示。

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

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

代碼實現(xiàn)

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

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

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

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

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

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

總結

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

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

相關文章

  • Java BigDecimal案例詳解

    Java BigDecimal案例詳解

    這篇文章主要介紹了Java BigDecimal案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Mybatis?Plus?新版lambda?表達式查詢異常的處理

    Mybatis?Plus?新版lambda?表達式查詢異常的處理

    這篇文章主要介紹了Mybatis?Plus?新版lambda?表達式查詢異常的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • MyBatis中Mapper的注入問題詳解

    MyBatis中Mapper的注入問題詳解

    這篇文章主要介紹了MyBatis中Mapper的注入問題,我知道在 SpringBoot 體系中,MyBatis 對 Mapper 的注入常見的方式有 2 種,具體哪兩種方法跟隨小編一起看看吧
    2021-09-09
  • spring boot 即時重新啟動(熱更替)使用說明

    spring boot 即時重新啟動(熱更替)使用說明

    這篇文章主要介紹了spring boot 即時重新啟動(熱更替)的相關資料,需要的朋友可以參考下
    2017-12-12
  • Java實現(xiàn)Huffman編碼的示例代碼

    Java實現(xiàn)Huffman編碼的示例代碼

    Huffman編碼是一種編碼方式,本文主要介紹了Java實現(xiàn)Huffman編碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 利用MultipartFile實現(xiàn)文件上傳功能

    利用MultipartFile實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了利用MultipartFile實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring中的循環(huán)依賴詳解

    Spring中的循環(huán)依賴詳解

    這篇文章主要介紹了Spring中的循環(huán)依賴詳解,  Spring 框架是一個流行的Java應用程序框架,它提供了許多強大的功能,如依賴注入和面向切面編程,然而在使用 Spring 框架時,我們可能會遇到循環(huán)依賴的問題,需要的朋友可以參考下
    2023-09-09
  • Java中的==使用方法詳解

    Java中的==使用方法詳解

    這篇文章主要介紹了Java中“==”的使用方法,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-09-09
  • Java IO流之原理分類與節(jié)點流文件操作詳解

    Java IO流之原理分類與節(jié)點流文件操作詳解

    流(Stream)是指一連串的數(shù)據(jù)(字符或字節(jié)),是以先進先出的方式發(fā)送信息的通道,數(shù)據(jù)源發(fā)送的數(shù)據(jù)經(jīng)過這個通道到達目的地,按流向區(qū)分為輸入流和輸出流
    2021-10-10
  • Java設計模式之狀態(tài)模式State Pattern詳解

    Java設計模式之狀態(tài)模式State Pattern詳解

    這篇文章主要介紹了Java設計模式之狀態(tài)模式State Pattern,狀態(tài)模式允許一個對象在其內部狀態(tài)改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣
    2022-11-11

最新評論