《leetcode101. 对称二叉树》

252 阅读2分钟

给定一个二叉树,检查它是否是镜像对称的。

  例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

思路:一棵树root,怎么判断它是不是对称的呢?如果这棵树为空,那就直接是对称的。如果左右子树都存在呢?发现,如果一棵树是镜像对称的,那么,它的左子树和右子树是互为对称的。所以,把问题转化为:如何判断两颗树r1,r2是互为对称的呢?

必须要满足三个条件:1. 这两棵树的顶点的值必须相等。2. r1的左子树和r2的右子树应该是互为对称的 3. r1的右子树和r2的左子树应该是互为对称的

那么我们发现,判断两棵树是否对称,需要用到他们的子树是否对称,所以用递归来写。

var isSymmetric = function(root) {
    if(!root){return true}
    return check(root.left,root.right)

    function check(r1,r2){
        if(!r1 && !r2){
            return true
        }else if(r1 && r2){
            return r1.val===r2.val && check(r1.left,r2.right) && check(r1.right,r2.left)
        }else{
            return false
        }
    }
};

先定义一个check函数,用于递归地判断传进去的两棵树是否互为对称。递归地终止条件就是,这两棵树都是空的,那么自然就是对称的。如果都不为空,那就要递归。如果只有一个为空,那就肯定不对称,因为对着的位置是空的。

100. 相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

           1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

输出: true

示例 2:

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false

示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

和上边的题思路类似。如何判断两棵树p,q是否相同?如果p,q都存在,首先必须满足p,q自己的值相等;而且,p的左孩子和q的左孩子是相同的;而且,p的右孩子和q的右孩子是相同的。 怎么判断p,q的左孩子相同呢?又回到了判断两棵树是否相同的问题。所以还是递归。递归的终止条件就是:如果某一次的p,q全为空,返回true。如果某次的p,q只有一个为空,就返回false;如果都不为空,就按照递归去判断。

var isSameTree = function(p, q) {
    if(!p && !q){
        return true
    }else if(p && q){
        return p.val===q.val && isSameTree(p.left,q.left) && isSameTree(p.right,q.right)
    }else{
        return false
    }
    
};