平衡二叉树的判定
平衡二叉树: 任意结点的左右子树高度差绝对值都不大于1的二叉搜索树。
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过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
题解:
/**
* @param {TreeNode} root
* @return {boolean}
*/
const isBalanced = (root) => {
let flag = true;
// 递归
function dfs(root){
//空树或者已经是非平衡则记为0
if(!root || !flag){
return 0;
}
//左右子树高度
const left = dfs(root.left);
const right = dfs(root.right);
if(Math.abs(left - right) > 1){
flag = false;
// 返回不影响计算的值0
return 0;
}
// 否则返回当前子树的高度
return Math.max(left, right) + 1;
}
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 = (root, n) => {
// 初始化中序遍历数组
const nums = [];
// 中序遍历二叉树得到有序数组
function inorder(root){
if(!root) return;
inorder(root.left);
nums(root.val);
inorder(root.right);
}
// 提成二叉搜索树
function buildAVL(low, high){
if(low > high) return null;
// 取中间值作为根节点
const mid = Math.floor(low + (hight - low)/2);
// 创建当前节点
const cur = new TreeNode(nums[mid]);
//构建左右子树
cur.left = buildAVL(low, mid - 1);
cur.right = buildAVL(mid + 1, high);
return cur;
}
inorder(root);
return buildAVL(0, nums.length - 1);
}
规则:
中序遍历求出有序数组,逐个将二分出来的数组子序列“提”起来变成二叉搜索树