12.19 LeetCode(剑指offer)

73 阅读1分钟

26.树的子结构

//注意边界问题
var isSubStructure = function(A, B) {
    if(!A||!B) return false;
    return helper(A,B)||isSubStructure(A.left, B)||isSubStructure(A.right, B);
};
var helper = (A, B)=>{
    if(!B) return true;
    if(!A) return false;
    return A.val===B.val&&helper(A.left, B.left)&&(A.right, B.right);
}

27.二叉树的镜像

//不敢相信,直接交换就行了,我在干嘛
var mirrorTree = function(root) {
    if(!root) return root;
    let tmp = new TreeNode(root.val);
    let res = tmp;
    helper(tmp, root);
    return res;
};
var helper = (res, root)=>{
    if(root.left){
        res.right = new TreeNode(root.left.val);
        helper(res.right, root.left);
    }
    if(root.right){
        res.left = new TreeNode(root.right.val);
        helper(res.left, root.right);
    }
}
//直接交换
var mirrorTree = function(root) {
    if(!root) return root;
    let left = mirrorTree(root.right);
    let right = mirrorTree(root.left);
    root.left = left;
    root.right = right;
    return root;
};

28.对称的二叉树

//弱智写法
var isSymmetric = function(root) {
    if(!root) return root;
    let tmp = new TreeNode(root.val);
    let res = tmp;
    helper(tmp, root);
    let stack1 = [res];
    let stack2 = [root];
    while(stack1.length!==0&&stack2.length!==0){
        let store1 = stack1.shift();
        let store2 = stack2.shift();
        if(store1.val!==store2.val) return false;
        if(store1.left){
            if(store2.left){
                stack1.push(store1.left);
                stack2.push(store2.left);
            }
            else{
                return false;
            }
        }
        if(store1.right){
            if(store2.right){
                stack1.push(store1.right);
                stack2.push(store2.right);
            }
            else{
                return false;
            }
        }
    }
    return stack1.length===stack2.length;
};
var helper = (res, root)=>{
    if(root.left){
        res.right = new TreeNode(root.left.val);
        helper(res.right, root.left);
    }
    if(root.right){
        res.left = new TreeNode(root.right.val);
        helper(res.left, root.right);
    }
}
//直接比较
var isSymmetric = function(root) {
    return root?helper(root.left, root.right):root;
};
var helper = (left, right)=>{
    if(!left&&!right) return true;
    if(!left||!right||left.val!==right.val) return false;
    //因为第一层条件已经过滤掉两者都为空的情况了,如果有一边为空则另一边一定不为空。
    return helper(left.left, right.right)&&helper(left.right,right.left);
}