101. 对称二叉树
题目描述
给你一个二叉树的根节点 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
解题方法
方法一:dfs
-
思路:
- 深度优先遍历,判断二叉树是否为镜像的话,需要比较子树的对称位置是否相同,即左子树的左侧与右子树的右侧,左子树的右侧和右子树的左侧
-
步骤:
- 判断两棵树节点
- 都为空则相同
- 一个为空另一个不为空,不同
- 节点都有值但是 val 不同,不同
- 递归他们的左子树和右子树
- 判断两棵树节点
-
复杂度分析:
- 时间复杂度: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) { const dfs = (left, right) => { if (left === null && right === null) { return true; } if (left === null || right === null) { return false; } if (left.val !== right.val) { return false; } return dfs(left.left, right.right) && dfs(left.right, right.left); }; return dfs(root.left, root.right);};方法二: bfs
-
思路:
- 广度优先遍历,将互为镜像的节点加入队列比较
-
步骤:
- 初始化队列,入队根节点的左节点和右节点
- 取队头前两项,比较值
- 将两个节点的左右子节点按照相反的顺序插入队列
- 当队列为空时或者比较的节点值不同时,结束循环
-
复杂度分析:
- 时间复杂度: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) { const queue = [root.left, root.right]; while (queue.length) { const left = queue.shift(); const right = queue.shift(); if (left === null && right === null) { continue; } if (left === null || right === null) { return false; } if (left.val !== right.val) { return false; } queue.push(left.left, right.right); queue.push(left.right, right.left); } return true;};