剑指offer-60.序列化二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxm1306192988/article/details/82022049

牛客

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树

题解:

所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。

依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。
另外,结点之间的数值用“ ”隔开。

public class Solution {
    String Serialize(TreeNode root) {
        if (root == null) {
            return "#";
        }
        return root.val + " " + Serialize(root.left) + " " + Serialize(root.right);
    }

    private String deserializeStr;

    public TreeNode Deserialize(String str) {
        deserializeStr = str;
        return Deserialize();
    }

    private TreeNode Deserialize() {
        if (deserializeStr.length() == 0)
            return null;
        int index = deserializeStr.indexOf(" ");
        String node = "";
        if (index != -1) {// 还剩多个结点
            node = deserializeStr.substring(0, index); // 提起该结点字符
            deserializeStr = deserializeStr.substring(index + 1);
        } else { // 就剩一个结点了
            node = deserializeStr; // 最后字符就是该结点的值
            deserializeStr = "";
        }
        if (node.equals("#")) // 如果是null结点
            return null;
        int val = Integer.valueOf(node);
        TreeNode t = new TreeNode(val); // 按先序遍历,递归
        t.left = Deserialize();
        t.right = Deserialize();
        return t;
    }
}

猜你喜欢

转载自blog.csdn.net/zxm1306192988/article/details/82022049