LeetCode 110. 平衡二叉树
1、题目
题目链接:110. 平衡二叉树
给定一个二叉树,判断它是否是 平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
提示:
- 树中的节点数在范围 [0, 5000] 内
- -104 <= Node.val <= 104
2、递归法
思路
代码
#include <iostream>using namespace std;//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:int getHeight(TreeNode* node) {// 如果节点为空,返回高度为0if (node == nullptr) {return 0;}// 递归计算左子树的高度int leftHeight = getHeight(node->left);// 如果左子树高度为-1,说明左子树不是平衡二叉树,直接返回-1if (leftHeight == -1) {return -1;}// 递归计算右子树的高度int rightHeight = getHeight(node->right);// 如果右子树高度为-1,说明右子树不是平衡二叉树,直接返回-1if (rightHeight == -1) {return -1;}int result = 0;// 如果左右子树的高度差大于1,说明不是平衡二叉树,返回-1if (abs(leftHeight - rightHeight) > 1) {result = -1;} else {// 否则,返回左右子树中较高的高度加1result = 1 + max(leftHeight, rightHeight);}return result;}bool isBalanced(TreeNode* root) {return getHeight(root) == -1 ? false : true;}
};int main() {TreeNode* root = new TreeNode(3);root->left = new TreeNode(9);root->right = new TreeNode(20);root->right->left = new TreeNode(15);root->right->right = new TreeNode(7);Solution solution;cout << solution.isBalanced(root) << endl;return 0;
}
复杂度分析
- 时间复杂度: O(n)
- 空间复杂度: O(n)
3、迭代法
思路
代码
class Solution {
private:int getDepth(TreeNode* cur) {stack<TreeNode*> stk;if (cur != NULL) stk.push(cur);int depth = 0;int result = 0;while (!stk.empty()) {// 获取栈顶元素TreeNode* node = stk.top();if (node != NULL) {// 如果节点不为空,则将其出栈stk.pop();// 将节点重新入栈,用于标记该节点已被访问过stk.push(node);// 将空指针入栈,用于标记该节点的子节点已访问完毕stk.push(NULL);// 深度加1depth++;// 如果右子节点存在,则将其入栈if (node->right) stk.push(node->right);// 如果左子节点存在,则将其入栈if (node->left) stk.push(node->left);} else {// 如果节点为空,则将其出栈stk.pop();// 获取栈顶元素,即该节点的父节点node = stk.top();// 将父节点出栈stk.pop();// 深度减1depth--;}// 更新最大深度result = result > depth ? result : depth;}return result;}public:bool isBalanced(TreeNode* root) {stack<TreeNode*> stk;if (root == nullptr) {return true;}stk.push(root);while (!stk.empty()) {// 取出栈顶节点TreeNode* node = stk.top();stk.pop();// 判断左右子树高度差是否大于1if (abs(getDepth(node->left) - getDepth(node->right)) > 1) {return false;}// 如果右子节点不为空,则将其压入栈中if (node->right) stk.push(node->right);// 如果左子节点不为空,则将其压入栈中if (node->left) stk.push(node->left);}return true;}
};
复杂度分析
- 时间复杂度: O(n^2)
- 空间复杂度: O(n)