分治

分治

  • 算法设计的一种方法
  • 将一个问题分成和原问题相似的小问题,递归解决,再将结果合并为原来的问题

场景

  • 归并排序
  • 快速排序
  • 二分查找

LeetCode

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

输入: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. 相同的树

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

img

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

img

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

img

输入: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:

img

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入: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)
};
posted @   凌歆  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示