110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过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 。
思路
这道题递归思想太巧妙了,还是对递归不是很熟练,写递归,不需要考虑深层递归,只要考虑一层就够了。考虑一棵简单二叉树
A
/ \
B C
若该二叉树平衡,那A的子树B和C一定要平衡,然后在判断根节点A平衡,也就是只需要判断A的左子树和右子树是否都平衡,如果都平衡再来判断根节点平衡。这就是一层简单的递归。如此反复下去,就完成了对一棵复杂二叉树的判断。
code
/**
* 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:
int getDepth(TreeNode* node) {
if(node == NULL) {
return 0;
}
int lh = getDepth(node->left); // 判断左子树是否平衡
if(lh < 0) return lh;
int rh = getDepth(node->right); // 判断右子树是否平衡
if(rh < 0) return rh;
if(abs(lh-rh)<2) // 如果左右子树都平衡,判断根节点是否平衡
return max(lh,rh)+1;
else
return -1; // 不平衡返回负数
}
bool isBalanced(TreeNode* root) {
int h = getDepth(root);
if(h>=0) return true;
else
return false;
}
};
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void Judge_AVL(struct TreeNode* bt, int *balance, int *h) {
int bl = 0,br = 0; // 左右子树平衡因子
int hl = 0,hr = 0; // 左右子树高度
if(bt == NULL) {
*h = 0;
*balance = 1;
}
else if(bt->left == NULL && bt->right == NULL) {
*h = 1;
*balance = 1;
}
else {
// 为何要用传值形式?因为要获取左右子树的平衡因子和高度,这就不需要通过返回值来获取了
Judge_AVL(bt->left, &bl, &hl); // 判断左子树是否平衡
Judge_AVL(bt->right, &br, &hr); // 判断右子树是否平衡
*h = (hl > hr ? hl : hr)+1;
if(abs(hl-hr)<2) // 若左右子树高度差的绝对值<2,则看左右子树是否平衡
*balance = bl&&br;
else
*balance = 0;
}
}
bool isBalanced(struct TreeNode* root){
int balance = 0;
int h = 0;
Judge_AVL(root, &balance, &h);
if(balance)
return true;
else
return false;
}