【温故知新】‘检查二叉树的平衡性’ 递归计算左右子树的高度

254 阅读3分钟

题目描述

实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 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 

示例 3:
以下二叉树跟节点3平衡,但是左子树9不平衡;
             3
            / \
           9  20
          /  /  \
         4  15   7
        /         \
      10           8  
返回 false 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-balance-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 根据平衡性的定义,计算每个节点的左右子树高度。
    • 如果某个节点的左右子树高度差大于1,则不平衡,返回false,算法结束;
    • 否则说明以当前节点为根的子树是平衡的,继续检查当前节点的左右子树的平衡性。

计算二叉树的高度:

递归,分解问题;

  • 当前二叉树的高度 = max(左子树高度,右子树高度) + 1
  • 左子树高度的计算方法和第1步相同
  • 若当前节点为null,返回0,作为递归出口
    按照以上分解方法可以到达递归出口

代码

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function isBalanced(root: TreeNode | null): boolean {
  if(root==null){
      return true;
  }
  let leftTreeDepth:number=treeDepth(root.left); 
  let rightTreeDepth:number=treeDepth(root.right);
  if(Math.abs(leftTreeDepth-rightTreeDepth)>1){
      return false;
  }
  // 如果当前树节点平衡,则检查左右子树平衡;
  return isBalanced(root.left)&&isBalanced(root.right);

};

// 计算树的高度;
 function treeDepth(root: TreeNode | null):number{
     if(root==null){
         return 0;
     }

     return Math.max(treeDepth(root.left),treeDepth(root.right))+1;

 }