我的问题与我发现的结果略有不同,而且我已经有一段时间没有使用 Java 了(新手),所以我需要一些说明。
基本上,我很确定我的实现大部分是正确的,我只是想为我所做的事情提供一些背景故事。
所以,我真正的问题是我已经将一个二叉树序列化为一个字符串:
1
2 3
4 5
作为:
1 2 4 # # 5 # # 3 # #
# 只是空节点。
当我试图从字符串重建它时,我的问题就来了。我已经进行了几个小时的挖掘,但我认为我过于复杂了。我只需要知道读取字符串的最简单方法(由空格分隔):
第一个元素是 1,因此我们将其更改为 int 并以此为元素创建一个节点。接下来是 2,所以做同样的事情,然后是 4。接下来是 #,所以我们忽略它,因为没有叶子等。
然后,我需要将字符串的剩余部分(减去已经从前面读取的部分)发送到递归调用中。
总而言之,我的问题基本上是“按照描述解析它并将剩余字符串发送到递归调用中的最简单方法是什么?”
最佳答案
下面是我序列化二进制和反序列化二叉树的代码。 我们只是将树按预定顺序转储到一个字符串中。 在这里,我使用了 Rahul 的代码,但我对其进行了修改以使其更加简洁。
public class DeSerializationBinaryTree {
public static String serialize(Node root) {
if (root == null)
return "# ";
else {
return root.val + " " + serialize(root.left) + serialize(root.right);
}
}
public static Node deserialize(String res) {
String[] tokens = res.trim().split("\\s+");
return deserialize(tokens);
}
static int index = 0;
private static Node deserialize(String[] stringArray) {
if (index >= stringArray.length)
return null;
if (stringArray[index].equals("#")) {
index++;
return null;
}
int value = Integer.parseInt(stringArray[index]);
Node tree = new Node(value);
index++;
tree.left = deserialize(stringArray);
tree.right = deserialize(stringArray);
return tree;
}
private static void inorder(Node root) {
if (root != null) {
inorder(root.left);
System.out.println(root.val);
inorder(root.right);
}
}
public static void main(String[] args) {
Node root = new Node(30);
Node node1 = new Node(10);
Node node2 = new Node(20);
Node node3 = new Node(50);
Node node4 = new Node(45);
Node node5 = new Node(35);
root.left = node1;
root.right = node2;
node1.left = node3;
node2.left = node4;
node2.right = node5;
System.out.println(serialize(root));
Node node = deserialize("30 10 50 # # # 20 45 # # 35 # # ");
inorder(node);
}
}
关于java - 从字符串反序列化 Java 二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115054/