这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战
题目描述
给一个二叉树的根节点,请你判断它是否为轴对称,如果是则返回true,否则返回false。
举个例子:
非轴对称,返回false(画的有点丑,凑合看)
是轴对称,返回true(这化的更有点丑)
是相同的树,但不是轴对称,返回false(感谢你能忍着看下来)
思路分析
第一种方法(递归)
通过上面的例子可以分析,它和上一篇文章判断相同的树不一样,相同的树是左边树,都要对应相等才可以,右边树,也要对应相等。
而对称二叉树,不是这样,它是要对称。
所以左边树和右边树,需要左边树的左子节点和右边树的右子节点相等才可以。
左边树的右子节点和右边树的左子节点相等才可以。
这样才是对称。
代码如下:
这个是用递归的方式实现,checkNodeIsSymmetric函数接受2个参数,左边树,和右边树,递归调用的时候传入左边树的左子节点和右边树的右子节点,如果相等,则继续判断,左边树的右子节点和右边树的左子节点。
判断到最后如果对称则返回true。
/**
* 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) {
function checkNodeIsSymmetric (l, r) {
if (!l && !r) return true
if (!l && r) return false
if (l && !r) return false
if (l.val !== r.val) return false
return checkNodeIsSymmetric(l.left, r.right) && checkNodeIsSymmetric(l.right, r.left)
}
return checkNodeIsSymmetric(root.left, root.right)
};
第二种方法(迭代)
这个方法是迭代方法,while循环实现的。用2个队列数组,左边树和右边树队列数组。存到是左右树的子节点,遍历完一层判断,再继续下一层。
判断的时候从队列数组的开头取出子节点判断,左边树的左子节点和右边树的右子节点判断,左边树的右子节点和右边树的左子节点判断。
如果判断到最后队列数组都为空的时候,如果此时还没有返回false,则代表遍历结束,则证明是对称二叉树,返回true即可。
代码如下:
/**
* 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) {
const l = root.left
const r = root.right
if (!l && !r) return true
if (!l || !r) return false
const lQuene = [l]
const rQuene = [r]
while (lQuene.length || rQuene.length) {
let lLen = lQuene.length
let rLen = rQuene.length
if (lLen !== rLen) return false
const l = lQuene.shift()
const r = rQuene.shift()
if (l.val !== r.val) return false
const ll = l.left
const lr = l.right
const rl = r.left
const rr = r.right
if ((ll && !rr) || (!ll && rr)) return false
if ((lr && !rl) || (!lr && rl)) return false
ll && lQuene.push(ll)
lr && lQuene.push(lr)
rr && rQuene.push(rr)
rl && rQuene.push(rl)
}
return true
};