当前位置: 首页 > article >正文

LeetCode 110.平衡二叉树

题目描述

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

示例 1:

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -10^4 <= Node.val <= 10^4

思路

平衡二叉树:每个节点的左右子树的高度差不超过1。

递归三部曲:

  1. 确定递归函数的参数和返回值。参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。
  2. 确定终止条件。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。
  3. 确定单层递归的逻辑。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。-1是标记,表示已经不是平衡二叉树了。

代码

C++版:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 递归法,后序遍历
    // 返回-1表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
    int getHeight(TreeNode* node){
        if(node==NULL) return 0; // 叶子结点高度为0
        // 如果子树不是平衡二叉树,那么整棵树就不是平衡二叉树
        int leftHeight=getHeight(node->left); // 左,求左子树高度
        if(leftHeight==-1) return -1; 
        int rightHeight=getHeight(node->right); // 右,求右子树高度
        if(rightHeight==-1) return -1;

        // 中,左右子树都是平衡二叉树
        int result=0;
        if(abs(leftHeight-rightHeight)>1){
            return -1;
        }
        else{
            result=max(leftHeight,rightHeight)+1;
        }
        return result; // 返回高度  
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root)==-1? false:true;
    }
};

Python版:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    # 递归法,后序遍历
    def getHeight(self,node: Optional[TreeNode]) -> int:
        if not node:
            return 0
        # 左
        leftHeight = self.getHeight(node.left)
        if leftHeight==-1 :
            return -1
        # 右
        rightHeight = self.getHeight(node.right)
        if rightHeight==-1 :
            return -1
        # 中    
        if abs(leftHeight-rightHeight)>1 :
            return -1
        else :
            return max(leftHeight,rightHeight)+1
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.getHeight(root) ==-1 :
            return False
        else :
            return True

需要注意的地方

1.回溯算法是比较复杂的递归,使用迭代法去实现它的话会比较麻烦,效率也不一定高。

2.可以使用层序遍历来求深度,例如【104.二叉树的最大深度】,但是本题中不能直接用层序遍历来求高度。

3.在迭代法中,如果是模拟前中后序遍历就用栈,如果是适合层序遍历就用队列,当然还是其他情况,那么就是先用队列试试行不行,不行就用栈。

4.求高度通常使用后序遍历,求深度通常使用前序遍历。


http://www.kler.cn/a/512113.html

相关文章:

  • Vscode:问题解决办法 及 Tips 总结
  • JS Clipboard API
  • STL--list(双向链表)
  • SQL Server查询计划操作符——查询计划相关操作符(4)
  • vue3+elementPlus之后台管理系统(从0到1)(day2)
  • 【Spring Boot】掌握 Spring 事务:隔离级别与传播机制解读与应用
  • 《Apple Store 上架过包》Guideline 4.3(a) - Design - Spam 解决 4.3 垃圾邮件
  • [c语言日寄]内存初阶:大端字节序和小端字节序
  • leetcode 3097. 或值至少为 K 的最短子数组 II 中等
  • Scade 表达式 - 使用索引的迭代器
  • 【算法学习笔记】35:扩展欧几里得算法求解线性同余方程
  • 2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)
  • 电子科大2024秋《大数据分析与智能计算》真题回忆
  • mysql的mvcc
  • 详解共享WiFi小程序怎么弄!
  • RFID系统安全认证协议及防碰撞算法研究(RFID Security)
  • Linux 存储设备和 Ventoy 启动盘制作指南
  • Linux C\C++方式下的文件I/O编程
  • Oracle 创建并使用外部表
  • JavaWeb项目——如何处理管理员登录和退出——笔记
  • Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用
  • AUTOSAR从入门到精通-自动驾驶测试技术(二)
  • CSS 合法颜色值
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)
  • 25春秋杯wp
  • Unity Shader学习日记 part5 CG基础