(算法)平衡二叉树

79 阅读2分钟

平衡二叉树的判定

平衡二叉树: 任意结点左右子树高度差绝对值都不大于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);
}

规则:

中序遍历求出有序数组,逐个将二分出来的数组子序列“提”起来变成二叉搜索树