分治
分治
- 算法设计的一种方法
- 将一个问题分成和原问题相似的小问题,递归解决,再将结果合并为原来的问题
场景
- 归并排序
- 快速排序
- 二分查找
LeetCode
226. 翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
提示:
- 树中节点数目范围在
[0, 100]
内 -100 <= Node.val <= 100
解题思路
1. 使用分治的思想(一般涉及左右子树 都是递归分治) 2. 分:树分成左右子树,把左右子树当成单独的一棵树,再递归 3. 合:递归出口后,调转左右子树位置
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {TreeNode} */ var invertTree = function(root) { // 分治 //递归出口 if(!root){ return null } // 翻转左右子树 const right=invertTree(root.left) const left=invertTree(root.right) // 将根节点返回 return new TreeNode(root.val,left,right) };
100. 相同的树
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内 -104 <= Node.val <= 104
解题思路
1.树相同的条件 2.根节点相同,左子树相同,右子树相同 3.分治 把左右子树当成单独的一棵树,进行上述判断
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} p * @param {TreeNode} q * @return {boolean} */ var isSameTree = function (p, q) { // 树相同的条件 // 根节点相同,左子树相同,右子树相同 // 分治 把左右子树当成单独的一棵树,进行上述判断 // 空树 if (p === null && q === null) { return true } if (p && q) { return ( p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right) ) } return false }
101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
解题思路
1. 根节点分为左右子树 2. 问题化为左子树和右子树是否镜像对称 3. 问题化为左子树的左子树是否镜像对称右子树的右子树 4. 和左子树的右子树是否镜像对称右子树的左子树 5. 递归出口:两颗树都为空,镜像对称 返回
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {boolean} */ var isSymmetric = function(root) { // 分治,分为左右子树 // 判断树1和树2 的左子树和右子树是否相互相等 if(!root){ return true } const isMarror=(l,r)=>{ // 递归出口 // 树1的左子树为空 树2的右子树为空 // 树1的右子树为空,树2的左子树为空 if(!l&&!r){ return true } if(l.val===r.val &&isMarror(l.right,r.left) &&isMarror(l.left,r.right) ){ return true } return false } return isMarror(root.left,root.right) };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!