方法:递归(自顶向下)
经过每个结点都得到它的左子树和右子树的最大深度,判断每个结点的左右子树深度差是否大于1。深度差不大于1则继续递归。
时间复杂度:o(n2)。第一个递归遍历二叉树所有节点,第二个递归查找深度最坏情况下(二叉树退化为链表)需要遍历二叉树所有节点。
空间复杂度:o(n)
class Solution { public: //获取树的最大深度 int getDepth(TreeNode* root) { if (root == nullptr) return 0; return max(getDepth(root->left) + 1, getDepth(root->right) + 1); } bool IsBalanced_Solution(TreeNode* pRoot) { if (pRoot == nullptr) return true; int left_depth = getDepth(pRoot->left); int right_depth = getDepth(pRoot->right); //一旦发现左子树与右子树的深度差大于1,直接返回false; if ((left_depth - right_depth) > 1 || (left_depth - right_depth) < -1) return false; return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right); } };
方法:递归(自底向上)
可以自底向上,从数的底部开始一边计算左右子树的深度,一边计算结点的左右子树是否为平衡二叉树,这样可以节省时间复杂度。
时间复杂度:o(n)。
空间复杂度:o(n)
class Solution { public: bool judgeBalance(TreeNode* root, int& depth) { if (root == nullptr) return true; int left_depth = 0; int right_depth = 0; if (judgeBalance(root->left, left_depth) == false || judgeBalance(root->right, right_depth) == false) return false; if (left_depth - right_depth > 1 || right_depth - left_depth > 1) return false; //得到最大深度 depth = (left_depth > right_depth) ? left_depth + 1 : right_depth + 1; return true; } bool IsBalanced_Solution(TreeNode* pRoot) { int depth = 0; return judgeBalance(pRoot, depth); } };