Balanced Binary Tree
今天是一道题目,来自LeetCode,难度为Easy,Acceptance为32.8%。
题目如下
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
解题思路及代码见阅读原文
回复0000查看更多题目
解题思路
首先,虽然该题为Easy,但是其实还是需要一些技巧的。当然看到二叉树还是应该第一时间想到二叉树的三种遍历方式。
- 该题是Easy的原因是该题可以很容易的想到时间复杂度为O(n^2)的方法。即按照定义,判断根节点左右子树的高度是不是相差1,递归判断左右子树是不是平衡的。代码如下:
class solution {
public:
int depth (TreeNode *root) {
if (root == NULL) return 0;
return max (depth(root -> left), depth (root -> right)) + 1;
}
bool isBalanced (TreeNode *root) {
if (root == NULL) return true;
int left=depth(root->left);
int right=depth(root->right);
return abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}
};
这种方法被称为top down approach,这样当然是可以的,但是该算法的时间复杂度为O(n^2),其实还有更为简单的方法,可以将时间复杂度将为O(n)。
- 方法如下,这种方法被称为the bottom up的方法,即从底向上的方法,即后序遍历的方法。
这种方法不是显式的从根节点开始计算每个节点的高度,然后比较左右子树的高度差。而是在计算树的高度的同时判断该树是不是平衡的。
即,先判断子树是不是平衡的,若是,则返回子树的高度;若不是,则返回一个非法的数字,如负数。
当一个节点是左右子树有一个不是平衡二叉树则不必继续计算,直接返回false;当左右子树都是平衡时,再比较两个子树的高度是否相差1。若不是,则返回false,否则返回该节点的高度。
最后,我们来看代码。
代码如下
Java版
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isBalanced(TreeNode root) {
return height(root) != -1;
}
private int height(TreeNode node){
if(null == node)
return 0;
int l = height(node.left);
if(l == -1)
return -1;
int r = height(node.right);
if(r == -1)
return -1;
if(l - r > 1 || r - l > 1)
return -1;
return 1 + Math.max(l, r);
}
}
C++版
class solution {
public:
int dfsHeight (TreeNode *root) {
if (root == NULL) return 0;
int leftHeight = dfsHeight (root -> left);
if (leftHeight == -1) return -1;
int rightHeight = dfsHeight (root -> right);
if (rightHeight == -1) return -1;
if (abs(leftHeight - rightHeight) > 1) return -1;
return max (leftHeight, rightHeight) + 1;
}
bool isBalanced(TreeNode *root) {
return dfsHeight (root) != -1;
}
};