题目:
将一棵多叉树,转换成二叉树,在通过这个二叉树还原成多叉树。
分析
毫无疑问,多叉树的头结点也是转换的二叉树的头结点。
多叉树如下图所示:
转换成二叉树,则将多叉树所有的节点X,将X的孩子全部放在X的左侧节点的右边界上。转换过后的二叉树如下图所示:
右树完全为null,这样既方便了转化,有方便了复原。
代码
多叉树结构如Node,子节点为List< Node >,encode()方法转换成二叉树时,采用深层优先遍历的方式,优先构建最底层子节点,还原时同样如此,采用深层优先遍历,优先还原子节点。
public static class Node{
int val;
List<Node> childNode;
public Node(int val){
this.val = val;
}
public Node(int val,List<Node> childNode){
this.val = val;
this.childNode = childNode;
}
}
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public static TreeNode encode(Node root){
if (root == null){
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = en(root.childNode);
return null;
}
public static TreeNode en(List<Node> childNode){
TreeNode head = null;
TreeNode cur = null;
for (Node child : childNode){
TreeNode tNode = new TreeNode(child.val);
if (head == null){
head = tNode;
}else{
cur.right = tNode;
}
cur = tNode;
cur.left = en(child.childNode);
}
return head;
}
public static Node decode(TreeNode root){
if (root == null){
return null;
}
Node head = new Node(root.val);
return null;
}
public static List<Node> de(TreeNode node){
List<Node> childNode = new ArrayList<>();
while (node != null){
Node cur = new Node(node.val,de(node.left));
childNode.add(cur);
node = node.right;
}
return childNode;
}