LeetCode
系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例:
输入: root = [1,2,2,3,4,4,3]
输出: true
输入: root = [1,2,2,null,3,null,3]
输出: false
提示
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
思路
这个题目和相同二叉树有点类似,所以可以借鉴之前的方法
既然是对称二叉树,那肯定是对根节点的左右子树进行遍历来对比
但是和判断相同二叉树的遍历又有些不同,以为这个是对称二叉树,所以我们在遍历的时候,两棵树的顺序是要相反的:
- 首先定义一个递归函数接收两个二叉树,判断两棵树是否对称
- 首先判断两棵树都为
null
,则返回true
- 然后判断其中一个二叉树为空,另一颗不为空则返回
false
- 然后对当前节点值进行判断,不相同则返回
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) {
// 判断两颗树是否对称
function isSameTree(p, q) {
// 两树均 null 返回 true
if (!p && !q) return true
// 只有一树 null 返回 false
if (!p || !q) return false
// 节点值不同 返回 false
if (p.val !== q.val) return false
// 最后返回递归 左右子树 的值
return isSameTree(p.left, q.right) && isSameTree(p.right, q.left)
};
return isSameTree(root.left, root.right)
};
优化
还可以使用迭代的方式来解决
var isSymmetric = function(root) {
// 定义一个迭代函数
function check (p, q) {
// 定义一个栈
const task = []
// 将传入的树存入栈
task.push(p),task.push(q)
// 遍历栈
while (task.length) {
// 取出栈的后两位
u = task.shift()
v = task.shift()
// 判断
if (!u && !v) continue
if ((!u || !v) || (u.val !== v.val)) return false
// 分别存入两树的左右子树
task.push(u.left)
task.push(v.right)
task.push(u.right)
task.push(v.left)
}
// 遍历结束返回true
return true
}
// 调用迭代函数返回结果
return check(root.left, root.right)
};