将 N 叉树编码为二叉树,并能将该二叉树解码为原 N 叉树。 一个 N 叉树是指每个节点都有不超过 N 个孩子节点的有根树。 类似地,一个二叉树是指每个节点都有不超过 2 个孩子节点的有根树。 你的编码 / 解码的算法的实现没有限制,你只需要保证一个 N 叉树可以编码为二叉树且该二叉树可以解码回原始 N 叉树即可。
结点定义
/**
* 多叉树的结点
*/
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 {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
n叉树转二叉树
把n叉树转为二叉树,遍历孩子结点列表,孩子结点直接添加为自己的右结点,孩子结点的子节点列表连接自己的左结点。
即 子节点的右节点都是父结点的子节点,子节点的左结点都是自己的子节点。
/**
* n叉树转化为二叉树
*
* @param root
* @return
*/
public TreeNode encode(Node root) {
if (root == null) {
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = en(root.children);
return head;
}
/**
* 把子节点全部转化到右子树
*
* @param children
* @return
*/
private TreeNode en(List<Node> children) {
TreeNode head = null;
TreeNode cur = null;
for (Node child : children) {
TreeNode node = new TreeNode(child.val);
if (head == null) {
head = node;
} else {
cur.right = node;
}
cur = node;
cur.left = en(child.children);
}
return head;
}
二叉树转n叉树
由编码得,子节点的右节点都是父结点的子节点,子节点的左节点都是自己的子节点
/**
* 二叉树转化为n阶树
*
* @param root
* @return
*/
public Node decode(TreeNode root) {
// 二叉树的右结点全是子节点
if (root == null) {
return null;
}
Node head = new Node(root.val);
head.children = de(root);
return head;
}
public List<Node> de(TreeNode root) {
List<Node> children = new ArrayList<Node>();
while (root != null) {
Node cur = new Node(root.val, de(root.left));
children.add(cur);
root = root.right;
}
return children;
}