题意:
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
平衡二叉树(Balanced Binary Tree),具有以下性质:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
方法一:
递归
思路:记录每个节点作为根的子树高度。递归。
当左右子树的高度差>1,则返回 false;否则返回 true。
class Solution { public: bool flag=true; bool IsBalanced_Solution(TreeNode* pRoot) { dfs(pRoot); return flag; } int dfs(TreeNode* root){//记录每个节点作为根的子树高度 if(root==nullptr) return 0; int t1=dfs(root->left);//左节点 int t2=dfs(root->right);//右节点 if(abs(t1-t2)>1){//高度差>1,则返回false flag=false; } return max(t1,t2)+1; } };
时间复杂度:空间复杂度:
方法二:
递归+剪枝
思路:参照方法一,但可以设置剪枝操作。
当发现左右子树的高度差>1,则置flag=false。剪枝操作:每次递归,都先判断flag是否false,如果 flag == false ,则直接 return 。
class Solution { public: bool flag=true; bool IsBalanced_Solution(TreeNode* pRoot) { dfs(pRoot); return flag; } int dfs(TreeNode* root){//记录每个节点作为根的子树高度 if(flag==false)//剪枝 return -1; if(root==nullptr) return 0; int t1=dfs(root->left);//左节点 int t2=dfs(root->right);//右节点 if(abs(t1-t2)>1){//高度差>1,则返回false flag=false; return -1; } return max(t1,t2)+1; } };
时间复杂度:空间复杂度: