将 N 叉树编码为二叉树
难度:
标签:
题目描述
代码结果
运行时间: 46 ms, 内存: 17.4 MB
/*
* 思路:
* 使用 Java Stream 编码 N 叉树为二叉树和解码二叉树为 N 叉树。
*
* 主要步骤与非 Stream 版本相同,但我们将使用 Stream API 来处理孩子节点的编码和解码。
*/
import java.util.*;
import java.util.stream.*;
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int val) {
this.val = val;
}
public Node(int val, List<Node> children) {
this.val = val;
this.children = children;
}
}
class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public class Codec {
public TreeNode encode(Node root) {
if (root == null) return null;
TreeNode newRoot = new TreeNode(root.val);
if (!root.children.isEmpty()) {
newRoot.left = encode(root.children.get(0));
}
TreeNode current = newRoot.left;
root.children.stream().skip(1).forEach(child -> {
current.right = encode(child);
current = current.right;
});
return newRoot;
}
public Node decode(TreeNode root) {
if (root == null) return null;
Node newRoot = new Node(root.val, new ArrayList<>());
TreeNode current = root.left;
Stream.iterate(current, Objects::nonNull, node -> node.right)
.forEach(node -> newRoot.children.add(decode(node)));
return newRoot;
}
}
解释
方法:
这个题解通过将N叉树(N-ary Tree)编码为二叉树(Binary Tree)的方式解决了如何在二叉树的数据结构中表示一个N叉树的问题。编码过程中,每个N叉树节点的所有子节点被转换为二叉树中的左子树,其中每个子节点成为前一个子节点的右子节点。解码过程则是编码的逆过程,它通过遍历二叉树,重新构建出原始的N叉树结构。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在编码过程中选择将N叉树的第一个子节点作为二叉树左子节点,而将其余子节点递归为右子节点?
▷🦆
在解码过程中,如何确保原始N叉树的子节点顺序被正确恢复?
▷🦆
在`encode_children`方法中,对于递归编码`children[1:]`的方式,这种切片操作的空间复杂度是多少?是否会影响算法的整体性能?
▷