剑指offer 2.25

91 阅读1分钟

剑指 Offer 37. 序列化二叉树

// “抄”了一遍....
var serialize = function (root) {
    if(!root) return '[]';
    let queue = [];
    queue.push(root);
    let store = [];
    while (queue.length) {
        let top = queue.shift();
        if (top == null) {
            store.push('null');// 防止null被toString清除
        }
        else {
            store.push(String(top.val));
            queue.push(top.left);
            queue.push(top.right);
        }
    }
    return '['+store.toString()+']';
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function (data) {
    if(data=='[]') return null;// 不能return [],这是一个地址。
    data = data.replace('[','');
    data = data.replace(']','');
    let store = data.split(',');// 删除收尾括号后才能拆分
    let i = 1;
    let root = new TreeNode(Number(store[0]));
    let queue = [root];
    while(i<store.length){
        let top = queue.shift();
        if(store[i]!='null'){// 若为空,结点的空子节点并不会显示。
            top.left = new TreeNode(Number(store[i]));
            queue.push(top.left);
        }
        i++;
        if(store[i]!='null'){
            top.right = new TreeNode(Number(store[i]));
            queue.push(top.right);
        }
        i++;
    }
    return root;
};
// 优化一下
var serialize = function(root) {
    if(!root) return '[]';
    let queue = [root];
    let res = [];
    while(queue.length){
        let pop = queue.shift();
        if(!pop){
            res.push('#');
            continue;
        }
        res.push(pop.val);
        queue.push(pop.left);
        queue.push(pop.right);
    }
    return '['+res.toString()+']';
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function(data) {
    if(data=='[]') return null;
    // data = data.replace('[','');
    // data = data.replace(']','');
    // let store = data.split(',');
    let store = data.substring(1,data.length-1).split(',')
    let index = 1;
    let root = new TreeNode(store[0]);
    let queue = [root];
    while(queue.length){
        let top = queue.shift();
        if(store[index]!='#'){
            top.left = new TreeNode(store[index]);
            queue.push(top.left);
        }
        index++;
        if(store[index]!='#'){
            top.right = new TreeNode(store[index]);
            queue.push(top.right);
        }
        index++;
    }
    return root;
};