将N叉树编码位二叉树

简介: 将N叉树编码位二叉树

力扣原题链接——将N叉树编码位二叉树

题目

设计一个算法,可以将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树。
一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。
类似地,一个二叉树是指每个节点都有不超过 2 个孩子节点的有根树。
你的编码 / 解码的算法的实现没有限制,你只需要保证一个 N 叉树可以编码为二叉树且该二叉树可以解码回原始 N 叉树即可。

例如,你可以将下面的 3-叉 树以该种方式编码:
在这里插入图片描述
注意,上面的方法仅仅是一个例子,可能可行也可能不可行。
你没有必要遵循这种形式转化,你可以自己创造和实现不同的方法。

题解

我们不按官方思路,我们的思路是:让多叉树的任何一个X的所有孩子,都放在X的左树的右边界上,解题过程中用到了深度优先遍历的思想

package com.harrison.class07;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @author Harrison
 * @create 2022-03-09-20:44
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class Code05_EncodeNaryTreeToBinaryTree {
    public static class Node{
        public int val;
        public List<Node> children;

        public Node(){

        }

        public Node(int _val){
            val=_val;
        }

        public Node(int _val,List<Node> _children){
            val=_val;
            children=_children;
        }
    }

    public static class TreeNode{
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int x){
            val=x;
        }
    }

    class Codec{
        public TreeNode encode(Node root){
            if(root==null){
                return null;
            }
            TreeNode head=new TreeNode(root.val);
            head.left=en(root.children);
            return head;
        }

        public 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;
        }
    }
}
相关文章
|
4月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
35 0
|
11月前
【LeetCode】1022. 从根到叶的二进制数之和、563. 二叉树的坡度
1022. 从根到叶的二进制数之和 1022. 从根到叶的二进制数之和
37 0
|
2天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
11月前
【Leetcode -617.合并二叉树 -1022.从根到叶的二进制数之和】
【Leetcode -617.合并二叉树 -1022.从根到叶的二进制数之和】
22 0
|
自然语言处理 算法 搜索推荐
哈夫曼树与哈夫曼编码
本文主要介绍实现哈夫曼树和哈夫曼编码
194 1
哈夫曼树与哈夫曼编码
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
|
存储 算法 搜索推荐
哈夫曼树、哈夫曼编码和字典树
哈夫曼树、哈夫曼编码和字典树
128 0
|
机器学习/深度学习
每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树
每日三题 对称二叉树 从前序与中序遍历序列构造二叉树 不同的二叉搜索树
86 4
每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树
每日三题-翻转二叉树、二叉树的最近公共祖先、二叉树的序列化与反序列化
每日三题-翻转二叉树、二叉树的最近公共祖先、二叉树的序列化与反序列化
62 1
每日三题-翻转二叉树、二叉树的最近公共祖先、二叉树的序列化与反序列化
哈夫曼树与哈夫曼编码(优先队列)
哈夫曼树与哈夫曼编码(优先队列)
335 0
哈夫曼树与哈夫曼编码(优先队列)