输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3/ \ 9 20 / \ 15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1/ \2 2/ \3 3 / \ 4 4
返回 false 。
思路:从上往下遍历树中的每一个结点,计算其左右子树的高度并进行对比,只要有一个高度差的绝对值大于 1,那么整棵树都会被判为不平衡
const isBalanced = function(root) {// 立一个flag,只要有一个高度差绝对值大于1,这个flag就会被置为falselet flag = true// 定义递归逻辑function dfs(root) {// 如果是空树,高度记为0;如果flag已经false了,那么就没必要往下走了,直接returnif(!root || !flag) {return 0}// 计算左子树的高度const left = dfs(root.left)// 计算右子树的高度const right = dfs(root.right)// 如果左右子树的高度差绝对值大于1,flag就破功了if(Math.abs(left-right) > 1) {flag = false// 后面再发生什么已经不重要了,返回一个不影响回溯计算的值return 0}// 返回当前子树的高度return Math.max(left, right) + 1}// 递归入口dfs(root)// 返回flag的值return flag};
平衡二叉树的构造
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
如果有多种构造方法,请你返回任意一种。
示例:

输入:root = [1,null,2,null,3,null,4,null,null] 输出:[2,1,3,null,null,null,4] 解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。
提示: 树节点的数目在 1 到 10^4 之间。 树节点的值互不相同,且在 1 到 10^5 之间。
/*** @param {TreeNode} root* @return {TreeNode}*/const balanceBST = function(root) {// 初始化中序遍历序列数组const nums = []// 定义中序遍历二叉树,得到有序数组function inorder(root) {if(!root) {return}inorder(root.left)nums.push(root.val)inorder(root.right)}// 这坨代码的逻辑和上一节最后一题的代码一模一样function buildAVL(low, high) {// 若 low > high,则越界,说明当前索引范围对应的子树已经构建完毕if(low>high) {return null}// 取数组的中间值作为根结点值const mid = Math.floor(low + (high -low)/2)// 创造当前树的根结点const cur = new TreeNode(nums[mid])// 构建左子树cur.left = buildAVL(low, mid-1)// 构建右子树cur.right = buildAVL(mid+1, high)// 返回当前树的根结点return cur}// 调用中序遍历方法,求出 numsinorder(root)// 基于 nums,构造平衡二叉树return buildAVL(0, nums.length-1)};
