Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)
前言
本文主要介紹如何把一個多叉樹轉(zhuǎn)換成二叉樹以及把二叉樹還原成多叉樹。
正文
給出一個多叉樹,實現(xiàn)一個函數(shù),這個函數(shù)可以把多叉樹轉(zhuǎn)成二叉樹,再實現(xiàn)一個函數(shù)把二叉樹還原成多叉樹。
如下圖所示,將多叉樹按某種規(guī)則進行轉(zhuǎn)化,轉(zhuǎn)成二叉樹,并且能從二叉樹再按某種規(guī)則還原回來。

思路分析
這道題類似于多叉樹的序列化和反序列化,不同的是把多叉樹序列化成二叉樹,反序列化是從二叉樹還原成多叉樹。
本題是力扣上的一道付費題目,雖然標(biāo)記的是困難型的題目,但是說難的話也不是很難,下面來看下具體思路。
本道題只是說按某種規(guī)則,并沒有明確指明使用什么規(guī)則,所以我們制定一個規(guī)則就好了。
轉(zhuǎn)成二叉樹規(guī)則,可以制定如下規(guī)則:
- 將多叉樹中任意一個
節(jié)點x的所有子節(jié)點,轉(zhuǎn)為節(jié)點x的左子樹的右邊界。
以下圖為例,節(jié)點a有3個子節(jié)點,在轉(zhuǎn)化二叉樹后,節(jié)點a只有一個左孩子b,而b有一個有孩子c,c有一個右孩子d。
同樣的節(jié)點b的子節(jié)點e、f轉(zhuǎn)化之后,節(jié)點e為節(jié)點b的左孩子,節(jié)點f為節(jié)點e的右孩子。
轉(zhuǎn)化結(jié)果為下圖所示。

如何還原呢?還原就是轉(zhuǎn)二叉樹的逆序。判斷二叉樹的節(jié)點,如果節(jié)點沒有左孩子那么這個節(jié)點一定是葉子節(jié)點,例如節(jié)點c、節(jié)點e、節(jié)點f、節(jié)點g、節(jié)點h、節(jié)點i都葉子節(jié)點。如果一個節(jié)點有左孩子,那么這個左孩子的所有子節(jié)點,也就所有右節(jié)點都為多叉樹的同級子節(jié)點。
本次分析的是將多叉樹的子節(jié)點,轉(zhuǎn)為二叉樹的右邊界,這個不是固定的,也可以是左邊界、也可以是其他形式,只要能轉(zhuǎn)化就可以,這里使用有邊界只是舉了個例子以及實現(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;
}
}先看下二叉樹轉(zhuǎn)二叉樹的代碼實現(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é)點,返回多叉樹的頭結(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;
}總結(jié)
本文主要介紹如何把一個多叉樹轉(zhuǎn)換成二叉樹以及把二叉樹還原成多叉樹,文中分析了多叉樹和二叉樹相互轉(zhuǎn)化的過程,實現(xiàn)起來不是很難,但是需要一點技巧,在代碼實現(xiàn)的過程中,使用了深度優(yōu)先遍歷。
到此這篇關(guān)于Java實現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)的文章就介紹到這了,更多相關(guān)Java 多叉樹和二叉樹互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Netty搭建WebSocket服務(wù)器實戰(zhàn)教程
這篇文章主要介紹了Netty搭建WebSocket服務(wù)器實戰(zhàn),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程
這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
關(guān)于idea-web.xml版本過低怎么生成新的(web.xml報錯)問題
今天通過本文給大家分享idea-web.xml版本過低怎么生成新的(web.xml報錯)問題,通過更換web.xml版本解決此問題,感興趣的朋友跟隨小編一起看看吧2021-07-07
Java ApiPost請求返回406狀態(tài)碼問題的解決方案
APIPost是一款專為開發(fā)者和測試人員設(shè)計的API測試工具,類似于Postman,但提供了更多的團隊協(xié)作和文檔管理功能,它可以幫助你更好地進行接口調(diào)試和集成測試,但遇到了請求后返回的是406狀態(tài),所以本文給大家介紹了Java ApiPost請求返回406狀態(tài)碼問題的解決方案2025-04-04
SpringBoot配置MySQL5.7與MySQL8.0的異同點詳解
MySQL 是 Java 開發(fā)中最常用的數(shù)據(jù)庫之一,而 Spring Boot 提供了便捷的配置方式,隨著 MySQL 8.0 的普及,許多開發(fā)者需要從 MySQL 5.7 升級到 8.0,在實際開發(fā)中,二者的配置方式既有相似之處,也有一些需要特別注意的不同點,所以本文給大家詳細介紹了它們的異同點2024-12-12

