判斷二叉樹是否平衡(letcodeC語言)
阿新 • • 發佈:2018-11-11
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。
示例 1:
給定二叉樹 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
給定二叉樹 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/
4 4
返回 false 。
總體思路:利用遞迴判斷左右子樹的深度是否相差1來判斷是否是平衡二叉樹。
解法一:利用maxDepth求出每個節點左右的深度,在求該結點的的左右子樹深度時遍歷一遍樹,再次判斷子樹的平衡性時又遍歷一遍樹結構,造成遍歷多次
int maxDepth(struct TreeNode* root) //求樹深度函式 { if(root == NULL) return 0; int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1; } bool isBalanced(struct TreeNode* root) { int ret; if(root == NULL) return true; int leftmaxDepth = maxDepth(root->left); int rightmaxDepth = maxDepth(root->right); ret = leftmaxDepth - rightmaxDepth; if(ret<-1 || ret>1) return false; else return isBalanced(root->left) && isBalanced(root->right);//還要堆每個節點分別進行遞迴,不然雖然數的節點高度差是0或1,但不是一顆二叉樹; }
方法二:是一邊遍歷樹一邊判斷每個結點是否具有平衡性。
bool IsBalanced(struct TreeNode* root, int* depth) { if(root == NULL) { *depth = 0; return true; } int leftDepth, rightDepth; if(IsBalanced(root->left,&leftDepth) && IsBalanced(root->right,&rightDepth)) { int ret = leftDepth - rightDepth; if(ret <= 1 && ret >= -1) { *depth = (leftDepth>rightDepth ? leftDepth : rightDepth)+1; return true; } } return false; } bool isBalanced(struct TreeNode* root) { int depth = 0; return IsBalanced(root, &depth); }