算法打卡第七天 (递归)

90 阅读2分钟

问题

  1. 剑指 Offer 26. 树的子结构
  2. 剑指 Offer 27. 二叉树的镜像
  3. 剑指 Offer 28. 对称的二叉树

剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

题意理解: 判断B否是A的子结构 遍历A树, 找到与B首节点相等的值的A节点,以B为参照,判断A是否和B相同,相同返回true, 否则急需遍历A 遍历完A树没找到,返回null

if (!A || !B) {
    return false;
}

function isSameTree(a, b) {
    if (!b) {
        return true;
    }
    if (!a) {
        return false;
    }
    if (a.val !== b.val) {
        return false;
    }
    return isSameTree(a.left, b.left) && isSameTree(a.right, b.right);
};
return (isSameTree(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));

剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

题意理解 将二叉树,整体对称,即每一层每一科都对称

  1. 如果节点存在,则左右互换,一直递归
var mirrorTree = function (root) {
    if (root === null) {
        return null;
    }
    const left = mirrorTree(root.left);
    const right = mirrorTree(root.right);
    root.left = right;
    root.right = left;
    return root;
};

剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

题意理解 将二叉树的镜像输出来,也就是将他对称的另一半输出

  1. 使用递归,左右子节点都不存在则返回true
  2. 左右子节点有一个不存在返回false
  3. 左右节点都存在但是值不同返回false
var isSymmetric = function(root) {
    if(!root) return true;
    function dfs(left, right) {
        if(!left && !right) return true;
        if(!left || !right) return false;
        if(left.val !== right.val) return false; 
        return dfs(left.left,right.right) && dfs(left.right,right.left); 
    }
    return dfs(root.left,root.right);
};