分而治之是算法设计中的一个方法
它将一个问题分成多个和原问题的小问题,递归解决小问题
归并排序
分: 把数组从中间一分为二
解: 递归的对两个子数组进行归并排序
和: 合并有序子数组
快速排序
分: 选基准,按照基准把数组分成两个子数组
解:递归的对两个子数组进行快速排序
合: 对两个子数组进行合并
LeetCode(374)猜数字大小
二分搜索法
分: 计算中间元素,分割数组
解: 递归的在较大或者较小子数组进行二分搜索
leetCode() 翻转二叉树
leetCode(100) 相同的二叉树
两棵树相同: 根节点是否相同,左子树是否相同,右子树是否相同
分: 获取左子树,右子树
解: 递归的判断两个树的左子树,右子树,是否相同
时间复杂度: O(n)。 是递归,遍历了树的所有节点
空间复杂度: O(n)
/*** 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 && !q) return true;const rec = (a, b) => {if(!a && !b) return trueif(a && b && a.val === b.val && rec(a.left, b.left) && rec(a.right, b.right)) {return true}return false}return rec(p, q)};
leetCode(101) 对称二叉树
转化为: 转换为左右子树是否镜像
分: 树1的左子树和树二的右子树
解:递归的判断树1的左子树和树2的右子树是否镜像
时间复杂度: O(n)。 是递归,遍历了树的所有节点
空间复杂度: O(n)
/*** 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) {if(!root) return trueconst isMirror = (l, r)=>{if(!l && !r) return trueif(l && r && l.val === r.val &&isMirror(l.left, r.right) &&isMirror(l.right, r.left)) {return true}return false}return isMirror(root.left, root.right)};
