首页 > 其他分享 >判断二叉树是否为平衡二叉树

判断二叉树是否为平衡二叉树

时间:2023-02-13 21:35:07浏览次数:48  
标签:node 判断 TreeNode 子树 right 二叉树 平衡 left

问题:判断二叉树是否为平衡二叉树面试题55 - II. 平衡二叉树(从底至顶、从顶至底,清晰图解) - 平衡二叉树 - 力扣(LeetCode)

方法一:后序遍历+剪枝,自下而上

后续遍历节点,递归向上返回子树的深度,同时判断当前子树是否为平衡二叉树,若不是则直接返回,称为剪枝。

recur(TreeNode* node)函数:当前子树的深度= 左右子树的深度最大值+1;当前子树左右子树深度差 >1则直接返回,不是平衡二叉树

时间复杂度:O(N);空间复杂度:O(N).

/**
 * 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:
    bool isBalanced(TreeNode* root) {
        return recur(root) != -1;
    }
private:
    int recur(TreeNode* node){
        if(node == nullptr) return 0;
        int left = recur(node->left);
        if(left == -1) return -1;//剪枝
        int right = recur(node->right);
        if(right == -1) return -1;
        return abs(left-right)<= 1 ? max(left,right)+1 : -1;
    }
};

方法二:前序遍历+深度,自顶向下

此方法会造成大量重复计算;自顶向下判断每个节点的深度差<=1,每个节点至少一次被访问;

判断当前子树是否为平衡二叉树;判断当前子树的左子树是否是平衡二叉树;判断当前子树的右子树是否是平衡二叉树;

Depth(TreeNode* node)计算当前节点的深度,返回左右子树深度的最大值+1;

时间复杂度:O(N logN);空间复杂度:O(N);

/**
 * 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:
    bool isBalanced(TreeNode* root) {
        if(root == nullptr) return true;
        return abs(Depth(root->left)-Depth(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
    }
private:
    int Depth(TreeNode* node){
        if(node == nullptr) return 0;
        return max(Depth(node->left),Depth(node->right))+1;
    }
};

 

标签:node,判断,TreeNode,子树,right,二叉树,平衡,left
From: https://www.cnblogs.com/xuan01/p/17117861.html

相关文章

  • 【C++复习】同名函数判断条件(重载,隐藏,覆盖)
    1、重载以下条件要全部满足:函数名相同以下条件满足其1:函数形参数目不同函数形参类型不同注意:不看返回值调用形式要不同//下面两个函数不能重载fun(inta,......
  • while 循环判断语句比循环操作多执行一遍
    inti,b,k=0;for(i=1;i<=5;i++){b=i%2;while(b-->=0){printf("%d\t",b);k++;}......
  • 前端APP版本号对比判断是否需要更新
    functioncompareVersion(newVersion,currentVersion){constv1=newVersion.split('.');constv2=currentVersion.split('.');......
  • 1234.replace-the-substring-for-balanced-string 替换子串得到平衡字符串
    问题描述1234.替换子串得到平衡字符串解题思路利用两个指针left,right,right从0开始遍历,如果[left,right]之外的字符串中,每个字符出现次数都小于或等于n/4,说明替换[lef......
  • mysql中判断一个字段是否为纯数字
    今天线上,某些数据的行政区划展示成数字了,应该是这个字段存了中文的名字而不是行政区划代码需求:查出表中某个字段不是纯数字,因为行政区划代码是纯数字,哪怕有一个汉字......
  • leetcode144-二叉树的前序遍历
    leetcode144-二叉树的前序遍历​​1、问题描述​​​​2、递归解法​​1、问题描述  给你二叉树的根节点​​root​​,返回它节点值的前序遍历。  示例1:输入:root=[......
  • 二叉树
    一、二叉树的定义二叉树是n(n≥0)个结点组成的有限集合。当n=0时,称为空二叉树;当n>0时,该集合由一个根节点及两颗互不相交的,被分别成为左子树和右子树的二叉树组成。二......
  • 输出二叉树第h层上的所有结点(1<=h<=k)
    输出二叉树第h层上的所有结点(1<=h<=k)问题引入:已知一颗二叉链表方式存储的深度为k的二叉树,根结点是第1层。编写算法,输出第h层所有结点,1<=h<=k。分析二叉树的算......
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)
    目录1.题目2.解题思路3.数据类型功能函数总结4.java代码5.踩坑记录1.题目从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定......
  • 二叉树的层序遍历
    二叉树的层序遍历一、定义       所谓二叉树的层次遍历,是指从二叉树的第一层(根节点开始)自上而下逐层遍历,同层内按照从左至右的顺序逐个结点访问。    ......