【每日刷题】平衡二叉树

题目地址

https://leetcode-cn.com/problems/balanced-binary-tree/

题目描述:平衡二叉树

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

一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过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.

问题是:如何让递归更加高效?

例如,如下树:

       1
      / \
     2   2
    / 	  \
   3   	   3
  /         \
 4           4

如果从顶向下递归,首先计算出根结点 1 的两个孩子的高度,比较;再计算出第 2 层的两个结点的孩子的高度,比较…,这个过程,无形中增加了大量的重复计算(计算根结点两个孩子高度时,已经计算了第 2 层的结点的两个孩子的高度)。

如何节省这些时间?

我们需要一种阻断方法,即自底向上递归。

首先看自顶向下的递归算法:

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int height( TreeNode* root){
        if( !root)
            return 0;
        return 1 + max( height(root->left), height(root->right));
    }
    bool isBalanced(TreeNode* root) {
        if( !root)
            return true;
        return isBalanced( root->left) && isBalanced( root->right) && abs( height( root->left) - height( root->right)) <= 1;	//这里进行了一点优化,从最下面开始计算
    }
};

再看自底向上的算法:

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int depth( TreeNode* root){
        if( root == NULL)   //当前节点不存在其层数为0
            return 0;
        int left = depth( root->left);  //获取左节点的层数
        if( left == -1)                 //如果层数为-1直接截断
            return -1;
        int right = depth( root->right);//获取右节点的层数
        if( right == -1)                //如果层数为-1直接退出
            return -1;
        //如果左右节点层数相差大于1 直接返回-1 否则返回真实层数
        return abs( left - right) <= 1 ? max( left, right) + 1: -1;
    }
    bool isBalanced(TreeNode* root) {
        //-1 即为存在层数相差大于1
        return depth( root) != -1;
    }
};

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页