给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 。
递归
- 递归的返回值类型,在递归的结束时我们应该返回什么
- 什么是递归结束点(递归的出口),递归的出口点我们应该返回什么
- 本层递归拿到返回值时应该做什么事,完成之后应该返回什么
一篇讲解递归不错的博客:https://lyl0724.github.io/2020/01/25/1/
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 { private: struct ReturnVal//返回值类型 { bool isBalance; int height; ReturnVal(bool isB,int h):isBalance(isB),height(h){} }; private: ReturnVal isBalancedCore(TreeNode* root) { if(root==nullptr)//递归结束条件,结束时应该返回什么 return ReturnVal(true,0); //本层递归应该干什么,完成之后应该返回什么,如果某一子树不是平衡二叉树,则整棵树不是平衡二叉树,直接把这颗子树的根节点高度设成-1代表不平衡,因为没有树的高度为-1 ReturnVal left=isBalancedCore(root->left); ReturnVal right=isBalancedCore(root->right); if(left.isBalance==false||right.isBalance==false||left.height==-1||right.height==-1) return ReturnVal(false,-1); return abs(left.height-right.height)>1?ReturnVal(false,-1):ReturnVal(true,max(left.height,right.height)+1); } public: bool isBalanced(TreeNode* root) { if(root==nullptr) return true; return isBalancedCore(root).isBalance; } };
code2:code1的简化
/** * 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 { private: int isBalancedCore(TreeNode* root)//递归返回值类型——返回以root为根节点的树的高度 { if(root==nullptr)//递归出口 return 0; //本层递归应该干什么 int leftHeight=isBalancedCore(root->left); if(leftHeight==-1) return -1; int rightHeight=isBalancedCore(root->right); if(rightHeight==-1) return -1; return abs(leftHeight-rightHeight)>1?-1:max(leftHeight,rightHeight)+1; } public: bool isBalanced(TreeNode* root) { if(root==nullptr) return true; return isBalancedCore(root)!=-1;//返回树的最大高度,如果不为-1这就是平衡二叉树 } };