前端算法小白攻略45-leetcode(平衡二叉树)

192 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

前言

你没有看错,二叉树也有平衡一说,今天我们就来看看什么样的二叉树叫做平衡二叉树。

题目描述

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

解题思路

如题所说,一个平衡的二叉树,它的左右两个子树的高度差是小于等于1的,看下题目中给几个示例如下:
平衡二叉树像这样:

image.png
该二叉树3根节点有9和20的子树,左子树9的高度为1,右子树20的高度为2,所以说这颗二叉树是平衡的;

不平衡的像这样:

image.png
该二叉树1根节点左子树高度为3,右子树高度为1,两者高度差为2,所以它不是平衡二叉树

题目中第三个例子还明确提出来了一个节点为空的二叉树也是平衡二叉树

本题重点思路:
  1. 根节点判空直接就是平衡二叉树

  2. 剩下我们需要两个递归函数,一个是递归遍历节点是否平衡处理高度差,一个递归计算树的高度
    处理平衡:
    先求出根节点的左右子树的高度差是否大于1,如果是就直接返回false,如果不是,则可以进行递归判断左右子树中每个节点是不是平衡的

    计算高度:
    首先我们需要一个计数变量来统计当前节点的层数,有多少层就代表有多高,只要当前节点不为空我们就给它加1,然后再递归计算出它左右子树的高度,我们取高度值大的那颗子树的高度作为当前节点子树的高度

开始解题

var isBalanced = function(root) {
    // 如果是空节点,那么直接判断当前节点数是平衡的
    if(!root) return true;  
    let leftL = getHeight(root.left,0);
    let rightL = getHeight(root.right,0);
    
    // 计算出当前节点左右子树的高度判断其是否平衡,若平衡再判断其左右子树各自的左右子节点树是否平衡
    if(Math.abs(leftL-rightL) <= 1) return isBalanced(root.left) && isBalanced(root.right);
    return false;
};

var getHeight = function(node,k) {
    // 若当前节点为空,直接返回当前节点树高度为0
    if(!node) return 0; 
    
    // node不为空,层数加1
    k++;
    
    // 再计算当前节点左右子树的高度,取高的那颗子树的高度加上k就是我们当前节点树的高度
    if(node.left || node.right) k+= Math.max(getHeight(node.left, 0), getHeight(node.right, 0));
    return k;
}