对称二叉树:左子树的左和右子树的右对比

一、判断对称 = 判断镜像

对称二叉树不是比较每个节点的左右子节点。而是比较左子树的左子节点和右子树的右子节点 ,以及左子树的右子节点和右子树的左子节点。

也就是交叉对比。


二、递归解法

javascript 复制代码
var isSymmetric = function(root) {
    if (!root) return true;
    return check(root.left, root.right);
};

function check(p, q) {
    if (!p && !q) return true;
    if (!p || !q) return false;
    if (p.val !== q.val) return false;
    return check(p.left, q.right) && check(p.right, q.left);
}

check(p.left, q.right) 和 check(p.right, q.left)------这就是交叉对比。


三、迭代解法

javascript 复制代码
var isSymmetric = function(root) {
    if (!root) return true;
    const queue = [root.left, root.right];
    while (queue.length) {
        const p = queue.shift();
        const q = queue.shift();
        if (!p && !q) continue;
        if (!p || !q) return false;
        if (p.val !== q.val) return false;
        queue.push(p.left, q.right);
        queue.push(p.right, q.left);
    }
    return true;
};

入队顺序也是交叉的:p.left, q.right 和 p.right, q.left。


四、复杂度

时间 O(n),空间 O(n)。


五、总结

  1. 对称 = 左子树和右子树互为镜像
  2. 交叉对比:左左 ↔ 右右,左右 ↔ 右左
  3. 递归代码最简洁,迭代用队列模拟
  4. 掌握对称二叉树 = 掌握翻转二叉树 + 判断两棵树相等
相关推荐
Suprman3 天前
平面排版问题的数学建模与算法设计
算法·数学建模·排序算法·排版套料
重生之小比特3 天前
【算法拾光】二分查找|在排序数组中查找元素的第一个和最后一个位置 + 搜索旋转排序数组
数据结构·算法·排序算法
YukiRinLL3 天前
查找与排序算法:复杂度、稳定性
数据结构·算法·排序算法
suhan4 天前
【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
数据结构·算法·排序算法
suhan4 天前
【数据结构】六、图:3.十字链表、邻接多重表、边集数组
数据结构·算法·排序算法
HPtiger4 天前
交换类排序详解:冒泡排序与快速排序
数据结构·算法·排序算法
程序员爱钓鱼4 天前
Go 编程实战:Benchmark——基准测试、testing.B、benchmem、性能对比与代码优化实战
go·排序算法
Suprman5 天前
从 B/S 到 Electron:平面排版套料系统桌面版开发实战
javascript·平面·electron·排序算法
HPtiger8 天前
数据结构——选择排序
数据结构·算法·排序算法
丑梨数据8 天前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法