[LC] 449. Serialize and Deserialize BST

https://leetcode.com/problems/serialize-and-deserialize-bst/

一般来说serialize和deserialize的要求就是这个数据能够完整且表示唯一的数据结构。有点像充要条件的意思。对于一般的binary tree,充要条件可能为一个preorder的数组和inorder的数组,也可能为一个inorder的数组和一个postorder的数组。我说的其实是下面两题:
https://blog.csdn.net/chaochen1407/article/details/43411599
https://blog.csdn.net/chaochen1407/article/details/43410745

但对于Binary Search Tree来说,充要条件一个preorder就够了。其实整个算法就是serialize重构一个preorder的数组,然后deserialize再通过这个preorder的数组来完成这棵树的重组。deserialize比较直观的做法就是一个个node进行插入,当然,也可以存在更高效的做法。先给出第一段代码:

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder strBlder = new StringBuilder();
        dfsSerialize(root, strBlder);
        return strBlder.toString();
    }
    
    public void dfsSerialize(TreeNode node, StringBuilder strBlder) {
        if (node != null) {
            strBlder.append(node.val + " ");
            dfsSerialize(node.left, strBlder);
            dfsSerialize(node.right, strBlder);
        }
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data.equals("")) return null;

        String[] nodeVals = data.split(" ");
        TreeNode root = null;
        for (String nodeVal : nodeVals) {
            int val = Integer.parseInt(nodeVal);
            TreeNode current = new TreeNode(val);
            if (root == null) {
                root = current;
            } else {
                TreeNode tmp = root;
                while (tmp != null) {
                    if (val > tmp.val) {
                        if (tmp.right != null) {
                            tmp = tmp.right;
                        } else {
                            tmp.right = current;
                            tmp = null;
                        }
                    } else {
                        if (tmp.left != null) {
                            tmp = tmp.left;
                        } else {
                            tmp.left = current;
                            tmp = null;
                        }
                    }
                }
            }
        }
        
        return root;
    }

其实deserialize还存在一个更为高效的做法。就是递归preorder dfs的形式自下而上的重构。


    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if (data.equals("")) return null;

        String[] nodeVals = data.split(" ");
        Integer[] vals = new Integer[nodeVals.length];
        for (int i = 0; i < nodeVals.length; i++) {
            vals[i] = Integer.parseInt(nodeVals[i]);
        }
        TreeNode root = null;
        int[] cursor = new int[1];
        
        return dfsDeserialize(vals, cursor, Integer.MAX_VALUE);
    }
    
    public TreeNode dfsDeserialize(Integer[] vals, int[] cursor, int rootVal) {
        if (cursor[0] == vals.length || vals[cursor[0]] > rootVal) {
            return null;
        }
        
        TreeNode node = new TreeNode(vals[cursor[0]]);
        cursor[0]++;
        node.left = dfsDeserialize(vals, cursor, node.val);
        node.right = dfsDeserialize(vals, cursor, rootVal);
        return node;
    }

这段代码的serialize和上面的一样,就不重复了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值