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 ofevery node never differ by more than 1.
分析:检查每个节点的左右子节点的高度差
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int maxRoot(TreeNode *root ){ if(root == NULL) return 0; return max(1+maxRoot(root->left), 1 + maxRoot(root->right)) ; } bool test(TreeNode *root) { if(root == NULL) return true; if( abs(maxRoot(root->left) - maxRoot(root->right)) >1) return false; return test(root->left) &&test(root->right) ; } bool isBalanced(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function if(root == NULL) return true; return test(root) ; } };
优化: 《剑指offer》上又一个优化的算法。使用后序遍历的方式,在遍历的过程中,计算每个节点的深度,并判断是否balanced
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool test(TreeNode *root, int &depth){ if(NULL == root){ depth = 0; return true; } int leftD, rightD; bool testLeft = test(root->left ,leftD); bool testRight = test(root->right, rightD); depth = leftD > rightD ? leftD+1 : rightD +1 ; if(testLeft && testRight){ return abs(leftD - rightD) < 2; } return false; } bool isBalanced(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function int depth; return test(root, depth); } };
--------------------------------------------------------------------天道酬勤!