[面试真题] LeetCode:Balanced Binary Tree
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.
递归地计算每个节点的左右子树深度,看其是否平衡。由于节点被重复访问,效率较低。
Program Runtime: 68 milli secs
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 12 13 int maxDepth(TreeNode *root){ 14 if(NULL == root){ 15 return 0; 16 } 17 int maxL = maxDepth(root->left); 18 int maxR = maxDepth(root->right); 19 return 1 + (maxL > maxR ? maxL : maxR); 20 } 21 22 public: 23 bool isBalanced(TreeNode *root) { 24 // Start typing your C/C++ solution below 25 // DO NOT write int main() function 26 if(NULL == root){ 27 return true; 28 } 29 int diff = maxDepth(root->left) - maxDepth(root->right); 30 if((diff>1) || (diff<-1)){ 31 return false; 32 } 33 return isBalanced(root->left) && isBalanced(root->right); 34 } 35 };
改进:使用后序遍历二叉树的节点,遍历时记录节点深度,同时也可以更快的判断出二叉树不平衡的情况。
可是奇怪的是执行时间反而变长了,不解。
Program Runtime: 84 milli secs
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 bool isBalanced(TreeNode *root, int *depth){ 12 if(NULL == root){ 13 *depth = 0; 14 return true; 15 } 16 int left, right; 17 if(isBalanced(root->left, &left) && isBalanced(root->right, &right)){ 18 int diff = left - right; 19 if((diff>1) || (diff<-1)){ 20 return false; 21 } 22 *depth = 1 + (left > right ? left : right); 23 return true; 24 } 25 } 26 27 public: 28 bool isBalanced(TreeNode *root) { 29 // Start typing your C/C++ solution below 30 // DO NOT write int main() function 31 int depth = 0; 32 return isBalanced(root, &depth); 33 } 34 };