问题描述:
给你一个二叉树的根节点root, 检查它是否轴对称。
示例1:
输入:root = [1,2,2,3,4,4,3]
输出:true
解题思路:递归。
- 判断root是否为空,如果为空,返回false, 否则递归遍历其左右子树
- 构造一个函数synRoot(left, right),用来判断以left, right为根的两棵树是否对称。
- 如果left为空,判断right是否为空。只有当right为空时才对称
- 如果right为空,此时的left一定不为空(如果为空会进入到上一个判断中),返回false
- 判断left.val是否等于right.val, 如果不等,返回false, 如果相等,进入到下一步
代码实现(js)
/**
* 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) {
// 1.判断root是否存在
if(root === null){
return false
}
// 2.如果存在,递归判断其左右子树
return synRoot(root.left, root.right)
};
// 判断以left,right为根的两个子树是否轴对称
function synRoot(left, right){
if(left === null){
// 如果left为空,right为空时才对称
return right === null
}
if(right === null){
// 如果right为空,而left不为空时,肯定不对称
return false
}
if(left.val !== right.val){
// 如果left和right节点的值不同,肯定不对称
return false
}
// 其他情况下
// 递归调用函数synRoot,判断左子树的左子树和右子树的右子树是否相等,以及左子树的右子树以及右子树的左子树是否相等
return (synRoot(left.left, right.right) && synRoot(left.right, right.left))
}