【二叉树】 449. 序列化和反序列化二叉搜索树

449. 序列化和反序列化二叉搜索树

解题思路

  1. 序列化:

使用BST的前序遍历,将树的节点值拼接成一个字符串。
在拼接节点值的过程中,使用逗号分隔各节点的值,形成一个前序遍历的字符串表示。

  1. 反序列化:

将序列化得到的字符串分割成数组。
利用前序遍历的特性,第一个元素为根节点,然后找到第一个大于根节点值的位置,该位置之前的部分为左子树的序列,之后的部分为右子树的序列。
递归调用反序列化函数,构建左子树和右子树。
返回根节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null){
            return "";
        }

        StringBuilder sb = new StringBuilder();
        serialize(root,sb);
        return sb.toString();
    }


    void serialize(TreeNode root,StringBuilder sb){
        if(root == null){
            return;
        }

        // 前序遍历 拼接当前的节点
        sb.append(root.val).append(",");
        serialize(root.left,sb);
        serialize(root.right,sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data == null || data.length() == 0){
            return null;
        }

        String[] arr = data.split(",");
        return deserialize(arr,0,arr.length - 1);
    }

    // 前序序列
    // 第一个元素是根节点 然后找到第一个大于根节点的值
    // 该值之前的部分是左子树 之后是右子树
    TreeNode deserialize(String[] arr,int lo,int hi){
        if(lo > hi){
            return null;
        }

        TreeNode root = new TreeNode(Integer.valueOf(arr[lo]));

        // 找到第一个比首元素大的元素位置
        int index = hi + 1;

        for(int i = lo + 1; i <= hi; i++){
            if(Integer.valueOf(arr[i]) > root.val){
                index = i;
                break;
            }
        }

        // 遍历左子树 右子树
        root.left = deserialize(arr,lo + 1,index -1);
        root.right = deserialize(arr, index,hi);

        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;

你可能感兴趣的:(#,Leetcode,java,算法,开发语言)