1. 题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1/ \2 2/ \ / \3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1/ \2 2\ \3 3
2. 解题思路
(1)递归:
递归的思路比较简单,具体实现思路如下:
- 首先判断当前树是否为空,空则直接返回true,否则就左子树的左子树和右子树的右子树是否相等
- 如果左节点或者右节点为空时,就比较对应的右节点或左节点是否为空,为空则返回true,否则就返回false
- 如果左右节点都不为空,就判断左节点的左节点和右节点的右节点是否相等
- 如果相等,就传入该节点的子节点进行递归,否则就返回false
递归的时间复杂度为O(n),空间复杂度为O(n)。
(2)迭代:
迭代方法需要借助队列来实现。
3. 代码实现
递归:
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*//*** @param {TreeNode} root* @return {boolean}*/var isSymmetric = function(root) {if(!root){return true}return isSameTree(root.left, root.right)};const isSameTree = (l, r) => {if(!l) return r === nullif(!r) return l === nullif(l.val !== r.val) return falsereturn isSameTree(l.left, r.right,) && isSameTree(l.right, r.left)}
迭代:
/*** Definition for a binary tree node.* function TreeNode(val) {* this.val = val;* this.left = this.right = null;* }*//*** @param {TreeNode} root* @return {boolean}*/const isSymmetric = (root) => {if (!root) return truelet queue = [root.left, root.right]while (queue.length > 0) {let t1 = queue.shift(), t2 = queue.shift()if (t1 === null && t2 === null) continueif (t1 === null || t2 === null || t1.val !== t2.val) return falsequeue.push(t1.left, t2.right, t1.right, t2.left)}return true}
4. 提交结果
递归:
迭代:
