分治

分治

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

场景

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

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 @ 2023-02-05 10:10  凌歆  阅读(34)  评论(0)    收藏  举报