分治
分治
- 算法设计的一种方法
- 将一个问题分成和原问题相似的小问题,递归解决,再将结果合并为原来的问题
场景
- 归并排序
- 快速排序
- 二分查找
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)
};
浙公网安备 33010602011771号