自頂向下遞迴(前序遍歷)
這種方法是一開始想到的,雖然ac了但是對於它的本質卻不清不楚,不知道時間複雜度,不知道屬於前序遍歷。
思路
首先得到root節點的左右子樹的深度(左右),若深度差絕對值大於1(中),則root為根的樹不是平衡二叉樹;
否則繼續遞迴root的左右子樹,其左右子樹都是平衡二叉樹時,root才是平衡二叉樹。
程式碼
class Solution {
public:
int depth(TreeNode* root){
if(root == nullptr)return 0;
return max(depth(root->left),depth(root->right)) + 1;
}
bool isBalanced(TreeNode* root) {
if(root == nullptr)return true;
int cha = depth(root->left) - depth(root->right);
if(cha > 1 || cha < -1)return false;
return isBalanced(root->left) && isBalanced(root->right);
}
};
複雜度
時間複雜度:O(n^2),n是節點個數
最壞情況,二叉樹是滿二叉樹,需要遍歷所有節點,時間複雜度O(n)
對於節點p,如果它的高度是d,則height(p)會被呼叫d次(即遍歷到它的每一個祖先節點時)。而最壞情況下,二叉樹是鏈式結構,高度為n,此時總時間複雜度為O(n^2)
自底向上遞迴(後序遍歷)
思路
程式碼
class Solution {
public:
int height(TreeNode* root){
if(root == nullptr)return 0;
int lheight = height(root->left);
int rheight = height(root->right);
//左右子樹不是平衡二叉樹就返回-1
if(lheight == -1 || rheight == -1)return -1;
//以root為根的樹不是平衡二叉樹也返回-1
if(abs(lheight - rheight) > 1) return -1;
//以root為根的樹是平衡二叉樹,則返回以root為根的樹的深度
return max(lheight,rheight) + 1;
}
bool isBalanced(TreeNode* root) {
return height(root) >= 0;
}
};