You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
8.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package leo.class07_11;
import java.util.ArrayList;
import java.util.List;
/**
* @author Leo
* @ClassName EncodeNaryTreeToBinaryTree
* @DATE 2020/12/9 5:30 下午
* @Description
* 本题测试链接https://leetcode.com/problems/encode-n-ary-tree-to-binary-tree
* 将多个子节点树序列化和反序列化为二叉树
*/
public class 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 {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
static class Codec {
// Encodes an n-ary tree to a binary tree.
public static TreeNode encode(Node root) {
if (root == null) {
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = en(root.children);
return head;
}
private static 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;
}
// Decodes your binary tree to an n-ary tree.
public static Node decode(TreeNode root) {
if (root == null) {
return null;
}
return new Node(root.val, de(root.left));
}
public static 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;
}
}
static class Codec1 {
public static TreeNode encode(Node root){
if (root == null) {
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = encode(root.children);
return head;
}
private static TreeNode encode(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 = encode(child.children);
}
return head;
}
public static Node decode(TreeNode root){
if (root == null) {
return null;
}
Node head = new Node(root.val);
head.children = de(root.left);
return head;
}
private static List<Node> de (TreeNode root) {
List<Node> children = new ArrayList<>();
while (root != null) {
Node node = new Node(root.val, de(root.left));
children.add(node);
root = root.right;
}
return children;
}
}
static class Codec2{
public static TreeNode encode(Node root){
if (root == null) {
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = encode(root.children);
return head;
}
private static TreeNode encode(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 = encode(child.children);
}
return head;
}
public static Node decode(TreeNode root){
if (root == null) {
return null;
}
Node head = new Node(root.val);
head.children = de(root.left);
return head;
}
public static List<Node> de(TreeNode root){
List<Node> children = new ArrayList<>();
while (root != null) {
Node node = new Node(root.val, de(root.left));
children.add(node);
root = root.right;
}
return children;
}
}
static class Codec3{
public static TreeNode encode(Node root) {
if (root == null) {
return null;
}
TreeNode head = new TreeNode(root.val);
head.left = en(root.children);
return head;
}
public static 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;
}
public static Node decode(TreeNode root) {
if (root == null) {
return null;
}
Node head = new Node(root.val);
head.children = de(root.left);
return head;
}
public static List<Node> de(TreeNode node) {
List<Node> list = new ArrayList<>();
while (node != null) {
Node cur = new Node(node.val, de(node.left));
list.add(cur);
node = node.right;
}
return list;
}
}
static class EncodeNaryTreeToBinaryTree_Main {
public static void main(String[] args){
int maxLevel = 10;
int range = 50;
int test = 100000;
System.out.println("start");
for (int i = 0; i < test; i++) {
TreeNode node = generateRandomNode(maxLevel, range);
Node decodeOrigin = Codec3.decode(node);
TreeNode encodeOrigin = Codec3.encode(decodeOrigin);
Node decode = Codec3.decode(encodeOrigin);
TreeNode treeNode = Codec3.encode(decode);
if (!isEqualsNode(treeNode, encodeOrigin)) {
System.out.println("fuck!");
}
}
System.out.println("end");
}
public static TreeNode generateRandomNode(int maxLevel, int range) {
return generate(1, maxLevel, range);
}
public static TreeNode generate(int curLevel, int maxLevel, int range) {
if (curLevel > maxLevel || Math.random() < 0.5) {
return null;
}
TreeNode head = new TreeNode((int) (range * Math.random() ));
head.left = generate(curLevel + 1, maxLevel, range);
head.right = generate(curLevel + 1, maxLevel, range);
return head;
}
public static boolean isEqualsNode(TreeNode head1, TreeNode head2) {
if (head1 != null && head2 == null) {
return false;
}
if (head1 == null && head2 != null) {
return false;
}
if (head1 == null && head2 == null) {
return true;
}
if (head1.val != head2.val) {
return false;
}
return isEqualsNode(head1.left, head2.left) && isEqualsNode(head1.right, head2.right);
}
}
}