持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
力扣100——对称二叉树
题目
对称二叉树是力扣当中的一道简单题,题目是:给定一个二叉树,判断其是否为对称二叉树。首先,我们需要搞懂,什么叫对称二叉树。对称二叉树是从根节点出发,左右两个子树的节点相同,比如左子树的左节点和右子树的右节点相等,那么这两个节点就是对称的。
我们需要求解的就是判断给定的二叉树是否为对称二叉树。那么我们该如何解题呢?
解题思路
在解这道题之前,我们需要思考这道题可以使用什么方法来解,说起二叉树,我们首先想到的就是递归与迭代,因为我们在二叉树的便利当中经常使用这两种方法来进行遍历。这里也不例外,我们这里使用递归的方法来进行求解。首先我们需要判断给我们的子树是否为null
,如果根节点为null
,那么我们直接返回true
,如果根节点不为null
,那么我们要对根节点的左右子树进行判断,如果他们全部为null
,那么也是对称的,如果他们有一个为null
,另外一个不为null
那么就是不对称的,我们直接返回false
。接下里我们要判断值是否相等,值相等,返回true
,值不相等,返回false
。依次类推,我们对左右子树进行递归操作。
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isSymmetric = function(root) {
// 判断root根节点是否为null
if(root === null){
return true;
}
// 返回左右子树比较后的结果
return subSym(root.left,root.right);
// 判断左右子树是否对称
function subSym(left,right){
// 如果左节点为空并且右节点也为空,那么两个子树对称,返回true
if(left === null && right === null){
return true;
}
// 如果左节点为null或右自节点为null,或左节点的值不等于右节点的值,则返回false
if(left === null || right === null || left.val !== right.val){
return false;
}
// 将左子树的左节点和右子树的右节点进行比较
const isLeft = subSym(left.left,right.right);
// 将右子树的左节点和左子树的右节点进行比较
const isRight = subSym(left.right,right.left);
// 返回两个子树的比较结果
return isLeft && isRight;
}
};