面试题:平衡二叉树

Posted Xuuuuu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题:平衡二叉树相关的知识,希望对你有一定的参考价值。

原题描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:

给定二叉树 [3,9,20,null,null,15,7]

  3
  / \
 9  20
     /  \
   15   7
返回 true 。

原函数

1bool isBalanced(struct TreeNode* root)
2
3}
 

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

实现代码
 1/**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 *     int val;
5 *     struct TreeNode *left;
6 *     struct TreeNode *right;
7 * };
8 */

9
10// 获取节点深度
11int treeHight(struct TreeNode* root){
12    if(root == NULL)
13        return 0;
14
15    int left = treeHight(root->left);
16    int right = treeHight(root->right);
17
18    return left>right ? left+1 : right +1;
19}
20
21bool isBalanced(struct TreeNode* root){
22    if(root == NULL)    // 判空
23        return true;
24
25    // 左右子节点深度
26    int left = treeHight(root->left);
27    int right = treeHight(root->right);
28
29    if(abs(left-right)>1)     // 判断是否为平衡二叉子树
30        return false;
31
32    // 向下递归检查每个子节点是否满足平衡二叉树的要求。
33    // 例如根节点的左右子树深度满足平衡二叉树要求,但其下某个子节点可能不满足平衡二叉树的要求,
34    // 所以要检查所有子节点。
35    return isBalanced(root->left) && isBalanced(root->right);
36}


这一题在 的基础上加深了难度。 要判断是否为平衡二叉树,我们就需要比较每一个子节点下左右子节点的深度,而获取节点深度就是上一题的考察内容。

最开始我觉得只需比较根节点下的左右子节点深度即可完成判断,但提交代码时就是无法通过,看了眼其他大神的代码才恍然大悟。 在判断时,不能只判断根节点下的左右子节点,而是对每一个子节点,我们都需要判断其左右子树的深度是否满足要求。

因为根节点下的左右子树可能满足平衡二叉树的要求,但是,如果其下的某个子节点的左右子树深度不满足要求的话,那么这个二叉树也不是一个平衡二叉树。

我正是因为遗漏了这条信息,才导致代码无法通过。

推荐阅读

以上是关于面试题:平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

面试题:平衡二叉树

每日一道面试题-平衡二叉树的判断

剑指Offer面试题55 - II. 平衡二叉树

程序员面试之必考题:平衡二叉树的基本概念

数据结构二叉树相关面试题 Java版 LeetCode题 ------- 二叉树

面试题28:对称的二叉树