LeetCode 对称二叉树算法题解 All In One
LeetCode 对称二叉树算法题解 All In One
对称二叉树原理 图解
101. Symmetric Tree
- 对称二叉树
https://leetcode.com/problems/symmetric-tree/
https://leetcode.cn/problems/symmetric-tree/
error
/**
* 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 dfs(node, arr) {
if(node === null) {
return;
}
// 中序遍历 (左根右)
dfs(node.left, arr);
arr.push(node.val);
dfs(node.right, arr);
// if(node.left !== null) {
// dfs(node.left, arr)
// }
// arr.push(node.val);
// if(node.right !== null) {
// dfs(node.right, arr)
// }
}
function isSymmetric(root: TreeNode | null): boolean {
let result = false;
// const left = [root.val];
// const right = [root.val];
const left = [];
const right = [];
dfs(root.left, left)
dfs(root.right, right);
console.log(`left`, left);
console.log(`right`, right);
if(JSON.stringify(left) === JSON.stringify(right.reverse())) {
result = true;
}
// if(JSON.stringify(left) === JSON.stringify(right.reverse()) && JSON.stringify(left) !== JSON.stringify(right)) {
// result = true;
// }
return result;
};
// 先序遍历 (根,左右)
// 后序遍历 (左右,根)
// 中序遍历 (左,根,右) 324
// 中序遍历,逆序 (右,根,左)423 => 324
// 分成左右 child
// 左 child 中序遍历 (左根右)
// 右 child 中序遍历 (左根右) 再逆序 (右根左)✅
// 比较是否相等
/*
通过测试用例:
195 / 199
输入:
[1,2,2,2,null,2]
输出:
true
预期结果:
false
*/
// function isSymmetric(root: TreeNode | null): boolean {
// // Symmetric Tree / 对称树
// // left child tree
// // right child tree
// // ??? 映射/反转: 2->3->4 / 3->4->2 ??? 2->4->3 / 4->3->2
// // 后续遍历 3->4->2->1
// // 先序遍历 1->2->4->3
// // 中序遍历 4->2->3->1
// return false;
// };
// tree generator 按层次,BFS 广度优先搜索生成 tree ✅ (从上到下,从左到右)
// [1,2,2,2,null,2 ] ❌ ??? 边界条件 [2,2] !== [2,2] 非镜像 bug ❌
// [1,2,2,2,null,2,2] ✅
solutions
动态遍历左右子树比较
/**
* 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 dfs(nodeLeft, nodeRight) {
if(nodeLeft === null && nodeRight === null) {
return true;
}
if(nodeLeft === null || nodeRight === null) {
return false;
}
if(nodeLeft.val !== nodeRight.val) {
return false;
}
return dfs(nodeLeft.left, nodeRight.right) && dfs(nodeLeft.right, nodeRight.left);
}
function isSymmetric(root: TreeNode | null): boolean {
return dfs(root.left, root.right);
};
// function dfs(node, arr) {
// if(node === null) {
// return;
// }
// // 中序遍历 (左根右)
// if(node.left !== null) {
// dfs(node.left, arr)
// }
// arr.push(node.val);
// if(node.right !== null) {
// dfs(node.right, arr)
// }
// }
// function dfsCompare(nodeLeft, nodeRight, flag) {
// if(nodeLeft === null && nodeRight === null) {
// return;
// }
// if(nodeLeft.val !== nodeRight.val) {
// flag = false;
// return;
// }
// if(nodeLeft.left !== null && nodeRight.right !== null) {
// dfsCompare(nodeLeft.left, nodeRight.right, flag)
// }
// if(nodeLeft.right !== null && nodeRight.left !== null) {
// dfsCompare(nodeLeft.right, nodeRight.left, flag)
// }
// }
// function isSymmetric(root: TreeNode | null): boolean {
// let result = true;
// dfsCompare(root.left, root.right, result)
// return result;
// };
// 先序遍历 (根,左右)
// 后序遍历 (左右,根)
// 中序遍历 (左,根,右) 324
// 中序遍历,逆序 (右,根,左)423 => 324
// 分成左右 child
// 左 child 中序遍历 (左根右)
// 右 child 中序遍历 (左根右) 再逆序 (右根左)✅
// 比较是否相等
/*
通过测试用例:
195 / 199
输入:
[1,2,2,2,null,2]
输出:
true
预期结果:
false
*/
// function isSymmetric(root: TreeNode | null): boolean {
// // Symmetric Tree / 对称树
// // left child tree
// // right child tree
// // ??? 映射/反转: 2->3->4 / 3->4->2 ??? 2->4->3 / 4->3->2
// // 后续遍历 3->4->2->1
// // 先序遍历 1->2->4->3
// // 中序遍历 4->2->3->1
// return false;
// };
// tree generator 按层次,BFS 广度优先搜索生成 tree ✅ (从上到下,从左到右)
// [1,2,2,2,null,2 ] ❌ ??? 边界条件 [2,2] !== [2,2] 非镜像 bug ❌
// [1,2,2,2,null,2,2] ✅
"use strict";
/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2023-01-15
* @modified 2023-02-02
*
* @description 101. Symmetric Tree
* @description 101. 对称树
* @difficulty Easy
* @ime_complexity O(n)
* @space_complexity O(n)
* @augments
* @example
* @link https://leetcode.com/problems/symmetric-tree/
* @link https://leetcode.cn/problems/symmetric-tree/
* @solutions
*
* @best_solutions
*
*/
export {};
const log = console.log;
/**
* 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)
* }
* }
*/
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 dfs(nodeLeft, nodeRight) {
// 同时到达叶子节点,对称 ✅
if(nodeLeft === null && nodeRight === null) {
return true;
}
// 非同时到达叶子节点,非对称 ❌
if(nodeLeft === null || nodeRight === null) {
return false;
}
// 对应节点的值不同,非对称 ❌
if(nodeLeft.val !== nodeRight.val) {
return false;
}
// return 递归
// 左子树 left === 右子树 right && 左子树 right === 右子树 left
return dfs(nodeLeft.left, nodeRight.right) && dfs(nodeLeft.right, nodeRight.left);
}
function isSymmetric(root: TreeNode | null): boolean {
return dfs(root?.left, root?.right);
};
LeetCode 题解 / LeetCode Solutions
https://www.youtube.com/results?search_query=+Leetcode+2
https://www.youtube.com/playlist?list=PLamwFu9yMruCBtS2tHUD77oI_Wsce-syE
YouTube & LeetCode 力扣官方算法题解视频列表
https://github.com/xgqfrms/leetcode/issues/14
https://www.youtube.com/channel/UCftIXZeipv4MTVwmfFphtYw/videos
类似问题
refs
©xgqfrms 2012-2025
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/17087686.html
未经授权禁止转载,违者必究!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2022-02-02 冻鱼复活 All In One
2021-02-02 vuepress & ReferenceError: window is not defined
2021-02-02 jira 优先级过滤
2021-02-02 value-key
2021-02-02 element-ui select get selected option object
2020-02-02 2020-0202
2020-02-02 SVG & getBBox