算法(TS):对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例一

示例一是对称二叉树

示例二

示例二不是对称二叉树

解法

如果二叉树的左右两棵树呈镜像对称,那么这个二叉树是对称二叉树。两个树互为镜像,需要满足下面的要求:

  1. 根节点的值相同
  2. 每个树的右子树都与另一个树的左子树镜像对称

解法一

用两个指针 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)

相关推荐
黑色的山岗在沉睡19 分钟前
LeetCode 189. 轮转数组
java·算法·leetcode
墨染点香20 分钟前
LeetCode 刷题【65. 有效数字】
算法·leetcode·职场和发展
源代码•宸1 小时前
Leetcode—2749. 得到整数零需要执行的最少操作数【中等】(__builtin_popcountl)
c++·经验分享·算法·leetcode·位运算
用户4822137167751 小时前
深度学习——AlexNet网络结构
算法
子兮曰1 小时前
🚀99% 的前端把 reduce 用成了「高级 for 循环」—— 这 20 个骚操作让你一次看懂真正的「函数式折叠」
前端·javascript·typescript
张子夜 iiii2 小时前
传统神经网络实现-----手写数字识别(MNIST)项目
人工智能·pytorch·python·深度学习·算法
芭拉拉小魔仙2 小时前
【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南
javascript·typescript·企业微信
lingggggaaaa2 小时前
小迪安全v2023学习笔记(七十八讲)—— 数据库安全&Redis&CouchDB&H2database&未授权&CVE
redis·笔记·学习·算法·安全·网络安全·couchdb
pusue_the_sun2 小时前
C语言强化训练(12)
c语言·开发语言·算法