剑指 Offer 55 - II. 平衡二叉树
题目描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
解题思路
- 判定二叉树是否是平衡二叉树,就要对每个节点,比较其左子树深度和右子树深度
- 如果左右子树深度之差大于1,那么就不是平衡二叉树
- 在具体实现上,如果自顶向下递归,那么求高度的函数需要遍历一次二叉树、递归判断平衡性的函数也要多次遍历二叉树,遍历的复杂度会提高到
O(N^2) - 可以用自底向下的递归,先求取左右子树的高度并判断平衡性
- 在求高度的函数中,使用-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:// 自底向上递归// 如果发现不平衡,则递归返回-1int getDepth(TreeNode* root) {if (!root) {return 0;}int leftDepth = getDepth(root->left);int rightDepth = getDepth(root->right);if (-1 == leftDepth || -1 == rightDepth || abs(leftDepth - rightDepth) > 1) {return -1;}return max(leftDepth, rightDepth) + 1;}bool isBalanced(TreeNode* root) {if (!root) {return true;}return getDepth(root) >= 0;}};
