C++——平衡二叉树的判断

给定一个二叉树,编程判断其是否是一个二叉平衡树。我们以Leetcode 110题为例来看。

平衡二叉树

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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.它的左子树是平衡二叉树
2.它的右子树是平衡二叉树
3.它的左右子树的高度差不大于1

换句话说:如果它的左子树或右子树不是平衡二叉树,或者它的左右子树高度差大于1,那么它就不是平衡二叉树。

其次,对于每一个局部二叉树,可以看作是root,left和right组成,很自然地,我们可以想到用递归方法。

我们首先判断left子树和right子树是否是平衡二叉树,如果不是则直接返回false。
再判断两树高度差是否不大于1,如果大于1也直接返回false。
否则说明以root为节点的子树是平衡二叉树,那么就返回true和它的高度。

最后,每层递归返回的值有哪些呢?

对于每一层二叉树,我们不仅需要知道其左右子树是否为平衡二叉树(bool类型),也要知道其左右子树的深度是多少(int类型),这样我们才能进行完整的判断。
这里我们可以定义一个新的结构体来对其进行描述。

 struct ReturnNode {
   
      bool isba;
      int depth;
      ReturnNode(bool i,int d):isba(i),depth(d) {
   }
  };

最后,完整的C++代码如下:

#i
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是判断叉树是否为衡二叉树的C++代码实现: ```c++ #include <iostream> #include <algorithm> using namespace std; // 定义二叉树节点 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 判断是否为衡二叉树 bool isBalanced(TreeNode* root) { if (root == NULL) { return true; } // 计算左右子树的深度 int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); // 判断左右子树的深度差是否大于1,如果大于1则不是衡二叉树 if (abs(leftDepth - rightDepth) > 1) { return false; } // 递归判断左右子树是否都是衡二叉树 return isBalanced(root->left) && isBalanced(root->right); } // 计算树的深度 int maxDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return max(leftDepth, rightDepth) + 1; } int main() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->left->right->left = new TreeNode(6); if (isBalanced(root)) { cout << "This is a balanced binary tree." << endl; } else { cout << "This is not a balanced binary tree." << endl; } return 0; } ``` 算法思路: 1. 首先计算二叉树的深度,可以使用递归的方式求解; 2. 然后分别计算左右子树的深度,判断其深度差是否大于1; 3. 如果深度差大于1,则不是衡二叉树,直接返回false; 4. 如果深度差小于等于1,则需要继续递归判断左右子树是否都是衡二叉树,如果都是衡二叉树,则返回true,否则返回false。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值