94、【树与二叉树】leetcode ——110. 平衡二叉树(C++版本)
题目描述
原题链接:110. 平衡二叉树
解题思路
一、后序遍历(自底向上)
在这里要和 90、【树与二叉树】leetcode ——104. 二叉树的最大深度:层次遍历+DFS+子问题分解(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:
bool flag = true; // flag用于判定是否为平衡二叉树
int heightTree(TreeNode* root) {
if(!root) return 0;
int leftheight = heightTree(root->left);
int rightheight = heightTree(root->right);
if(abs(leftheight - rightheight) > 1) {
flag = false; // 当不满足平衡二叉树性质时,变为false
}
return max(leftheight, rightheight) + 1; // 返回当前结点高度
}
bool isBalanced(TreeNode* root) {
heightTree(root);
return flag;
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
n
)
O(n)
O(n)
二、先序遍历(自顶向下)
这个方法并不推荐,需要从上到下每次查看各个结点的高度差是否小于等于1,会将下面的结点重复遍历。
class Solution {
public:
int height(TreeNode* root) {
if (root == NULL) {
return 0;
} else {
return max(height(root->left), height(root->right)) + 1;
}
}
bool isBalanced(TreeNode* root) {
if (root == NULL) {
return true;
} else {
return abs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
}
};
时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
时间复杂度
O
(
n
)
O(n)
O(n)
相关文章
- 托管C++线程锁实现 c++11线程池
- 图像线性变换的原理及基于OpenCV的C++实现
- 66 C++ - 流的概念和流类库的结构
- C++中构造函数什么时候会被调用(从本质上理解)
- 【C++】:想知道如何实现互译字典吗?来看二叉搜索树
- 《C++编程惯用法——高级程序员常用方法和技巧》——1.1 有关电话号码的抽象模型
- 基于 QT(C++)实现的(图形界面)日历【100010590】
- [第七届蓝桥杯省赛C++B组]快速排序
- C++的ABI真特么是evil
- 177、【动态规划】leetcode ——11035. 不相交的线(C++版本)
- 141、【贪心算法】leetcode ——56. 合并区间(区间重叠解法+双指针解法)(C++版本)
- 124、【回溯算法】leetcode ——46. 全排列(C++版本)
- 123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)
- 113、【树与二叉树】leetcode ——538. 把二叉搜索树转换为累加树:递增数组视角右中左遍历(C++版本)
- 112、【树与二叉树】leetcode ——108. 将有序数组转换为二叉搜索树:二分查找树(C++版本)
- 107、【树与二叉树】leetcode ——236. 二叉树的最近公共祖先:回溯法(C++版本)
- 105、【树与二叉树】leetcode ——530. 二叉搜索树的最小绝对差:中序遍历递归法+迭代法(C++版本)
- 103、【树与二叉树】leetcode ——700. 二叉搜索树中的搜索:递归法+迭代法(C++版本)
- 95、【树与二叉树】leetcode ——257. 二叉树的所有路径:递归法DFS/回溯法+迭代法DFS+层序遍历BFS(C++版本)
- 92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)
- 88、【树与二叉树】leetcode ——226. 翻转二叉树:先中后序的递归与DFS非递归遍历+BFS层次遍历(C++版本)
- 87、【栈与队列】leetcode ——347. 前 K 个高频元素:优先队列(小根堆)+Hash表(C++版本)
- 72、【哈希表】leetcode——454. 四数相加 II(C++版本)
- 66、【链表】leetcode——142. 环形链表 II(C++、Python版本)
- C++编程规范之18:尽可能局部地声明变量