/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return bool布尔型 */ // int count; int height(TreeNode * pRoot) // level 表示当前的层数 { // int count = 0; if(pRoot == nullptr) return 0; int left = height(pRoot->left); int right = height(pRoot-> right); return max(left,right) + 1; } bool IsBalanced_Solution(TreeNode* pRoot) { // write code here if(pRoot == nullptr) return true; //printf("left:%d,right:%d\n",left,right); bool l = IsBalanced_Solution(pRoot ->left); if(!l) return false; bool r = IsBalanced_Solution(pRoot ->right); if(!r) return false; // 后序遍历的好处 1。可以降低时间复杂度,比如1这个节点先序把2判断了一次 然后走到2 又判断2 产生了重复计算 int left = height(pRoot ->left); int right = height(pRoot ->right); // 分开算高度也会产生重复计算吗,因为算1的高度的时候,已经顺带把2的高度也算出来,但是走到2的时候又会算一遍 // 我们把两个函数都改成后续是为了和2为1 if(abs(left - right)> 1) return false; return true; // printf("l:%d,r:%d\n",l,r); //return false; return l && r; } // 方法2 int dfs(TreeNode* root) // 因为既要返回 是否是平衡二叉树的bool值 又要返回高度 // 所以我们规定返回 -1 为不是平衡二叉树 其他就是高度 { if(root == nullptr) return 0; int left = dfs(root->left); if(left == -1) return -1; int right = dfs(root->right); if(right== -1) return -1; return abs(left -right ) <= 1 ? max(left,right) +1 : -1; } bool IsBalanced_Solution(TreeNode* pRoot) { return dfs(pRoot) != -1; } };