给你一个二叉树的根节点 root , 检查它是否轴对称。
示例一
示例一是对称二叉树
示例二
示例二不是对称二叉树
解法
如果二叉树的左右两棵树呈镜像对称,那么这个二叉树是对称二叉树。两个树互为镜像,需要满足下面的要求:
- 根节点的值相同
- 每个树的右子树都与另一个树的左子树镜像对称
解法一
用两个指针 v、u 分别指向左右子树的根,比较 v、u的值是否相等,不相等则不是对称二叉树,相等则将 v 移动到 v.left,将 u 移动到u.right,比较他们指向的节点是否相等,还要将 v 移动到 v.right,将 u 移动到u.left,比较他们指向的节点是否相等。任意一边不相等则说明不是对称二叉树。
递归实现:如下
ts
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function isSymmetric(root: TreeNode | null): boolean {
const check = (v: TreeNode | null,u: TreeNode | null):boolean => {
if (!v && !u) return true
if (!v || !u) return false
if (v.val !== u.val) return false
return check(u.left,v.right) && check(u.right,v.left)
}
return check(root.left,root.right)
};
时间复杂度O(n),空间复杂度O(n)
解法二
迭代实现。首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。将需要比较是否相同的两个节点(即v.right和u.left、v.left和u.left)连续放在队列中,入队列的时候一次入两个,出队列的时候也一次出两个。如果出队列的节点值不相同则说明不是对称二叉树。
ts
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function isSymmetric(root: TreeNode | null): boolean {
if (!root) return true
const stack = [root,root]
while(stack.length) {
let u = stack.shift()
let v = stack.shift()
if (!u && !v) {
continue
}
if (!u || !v) {
return false
}
if (u.val !== v.val) {
return false
}
stack.push(u.left)
stack.push(v.right)
stack.push(u.right)
stack.push(v.left)
}
return true
};
时间复杂度O(n),空间复杂度O(n)