携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
1. 引言
接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…
2. 题型
- 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
思路:
首先,此题考查的是二叉树兄弟节点是否对称,
递归法:我们首先确认可以使用递归操作检测每个树子节点。需要比较子树每个节点对称位置是否相同,及左树的左节点和右树的右节点,左树的右节点和右树的左节点是否相同;如果是,接着依次递归操作执行下一层树。如果上述都成立切根节点的值也相同,说明左右两树互为镜像树。 复杂度分析:时间复杂度O(n),每个节点遍历一次。空间复杂度O(n);
迭代法:使用队列,将互为镜像的节点添加如队列中,然后再比较。 复杂度分析:时间复杂度O(n),空间复杂度O(n); 解答:
/**
* 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) {
if(!root) return true;
const isMirror = (l, r) => {
if(!l && !r) return true
if(l && r
&& l.val == r.val
&& isMirror(l.left,r.right)
&& isMirror(l.right,r.left)){
return true
}
return false
}
return isMirror(root.left, root.right)
};
// 迭代法
var isSymmetric = function(root) {
if(!root) return true
const isMirror = (l, r) => {
const queue = [l, r]
while (queue.length){
const first_step = queue.shift();
const second_step = queue.shift();
if(!first_step && !second_step) continue;
if(!first_step || !second_step) return false;
if(first_step.val !== second_step.val) return false;
queue.push(first_step.left, second_step.right);
queue.push(first_step.right, second_step.left);
}
retun true
}
return isMirror(root.left, root.right)
};