序列化和反序列化BST

  • 1 序列化:

    • 参考上一篇博客提到的前序遍历二叉树的方法,不难得出序列化BST的方法。
    • 其实就是通过前序遍历,将遍历到的节点依次存到字符串里面。
  • 2反序列化

    • 先将待反序列化的字符串内的元素按顺序存到队列内;
    • 将跟节点设为队列的头元素;
    • 遍历队列,找到大于根节点的元素,并以此为分界,分别递归调用队列的左区间和右区间;
    • 左区间返回的值作为跟节点的左孩子,右边返回的值作为根节点的右孩子。

代码实现如下:

public class Codec {

    private static final String NULL = "null";

    //序列化
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        if (root == null) return NULL;
        Stack<TreeNode> stack = new Stack<>();
        while (!stack.isEmpty() || root != null) {
            if (root != null) {
                stack.push(root);
                sb.append(root.val).append(",");
                root = root.left;
            } else {
                root = stack.pop().right;
            }
        }

        return sb.toString();
    }

    //反序列化
    public TreeNode deserialize(String data) {
        if (data == NULL) return null;
        String[] s = data.split(",");
        Queue<Integer> queue = new LinkedList<>();
        for (String e : s) {
            queue.offer(Integer.parseInt(e));
        }
        return getRoot(queue);
    }

    private TreeNode getRoot(Queue<Integer> queue) {
        if (queue.isEmpty()) {
            return null;
        }
        TreeNode root = new TreeNode(queue.poll());
        Queue<Integer> subQueue = new LinkedList<>();
        while (!queue.isEmpty() && queue.peek() < root.val) {
            subQueue.offer(queue.poll());
        }
        root.left = getRoot(subQueue);
        root.right = getRoot(queue);
        return root;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值