本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
1、自顶向下的方法 时间复杂度O(n^2)
1 //自顶向下的方法:先求左右子树的深度 深度差的绝对值大于1则 不是平衡的 2 //由于每次都要求左右子树的深度 时间复杂度为O(n^2) 3 class Solution { 4 public: 5 bool isBalanced(TreeNode* root) { 6 if(!root) return true;//空节点是平衡的 7 //判断根节点是否平衡 左右子树深度差的绝对值小于等于1 则平衡 8 bool root_balance=abs(depth(root->left)-depth(root->right))<=1?true:false; 9 //如果根节点不平衡 则此树不平衡 10 if(!root_balance) return false; 11 //根节点平衡 则判断左右子树是否平衡 12 else return isBalanced(root->left)&&isBalanced(root->right); 13 } 14 int depth(TreeNode* root)//求以root为根结点的树的深度 15 { 16 if(!root) return 0; 17 else 18 return max(depth(root->left),depth(root->right))+1;//取左右子树大的深度+1 19 } 20 };
2、自底向上的方法 时间复杂度O(n)
1 //自底向上的方法 时间复杂度O(n) 2 //树的后根序遍历 从下向上判断 从最左边的节点开始 3 class Solution { 4 public: 5 bool isBalanced(TreeNode* root) { 6 return depth(root)!=-1;//不为-1 代表此树中没有不平衡的结点 7 } 8 int depth(TreeNode* root)//求以root为根结点的树的深度 9 { 10 //当返回值大于等于零时代表树的深度 11 //当返回值等于-1时 代表已找到不平衡的结点 12 if(!root) return 0; 13 int left_depth=depth(root->left); 14 if(left_depth==-1) return -1;//已在左子树中找到 不平衡的结点 可以停止递归了 15 int right_depth=depth(root->right); 16 if(right_depth==-1) return -1;//已在右子树中找到 不平衡的结点 可以停止递归了 17 //如果左右子树的深度差小于1 则此节点平衡 返回左右节点最深的深度+1 18 //如果左右子树深度差大于1 则此结点不平衡 返回-1 19 return (abs(left_depth-right_depth)<=1?max(left_depth,right_depth)+1:-1); 20 } 21 };