输入一棵二叉树,判断该二叉树是否是平衡二叉树。
/*
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode (int x)
{
val = x;
}
}*/
分析:通过计算左右子树的高度差的绝对值来判断是否为平衡二叉树
常规思路:从根节点开始,求根左右子树高度,如果高度差大于1,返回false;否则递归判断左右子树是否满足条件
class Solution
{
bool isBalance=true;
public bool IsBalanced_Solution(TreeNode pRoot)
{
if(pRoot==null)
return true;
else if(System.Math.Abs(TreeDepth(pRoot.left)-TreeDepth(pRoot.right))>1)
return false;
else
return IsBalanced_Solution(pRoot.left)&&IsBalanced_Solution(pRoot.right);
}
public int TreeDepth(TreeNode root)
{
if(root==null) return 0;
return System.Math.Max(TreeDepth(root.left), TreeDepth(root.right))+1;
}
}
另解:常规思路重复的计算子树的高度。可以用后序遍历,从下到上遍历如果子树中任一不满足条件返回 false,否则返回 true 这样每个节点的高度只会算一次。
class Solution
{
bool isBalanced=true;
public int GetHeight(TreeNode pRoot)
{
if(pRoot==null)
return 0;
else
{
int left=GetHeight(pRoot.left);
int right=GetHeight(pRoot.right);
if(System.Math.Abs(left-right)<=1)
isBalanced=true;
else
isBalanced=false;
return left>right?left+1:right+1;
}
}
public bool IsBalanced_Solution(TreeNode pRoot)
{
GetHeight(pRoot);
return isBalanced;
}
}
复习回顾知识点:
<C#中Math>
Math.Ceil() 向上进位取整;Math.RoundToInt() 四舍五入到整数
Math.Round() 四舍五入;Math.Abs() 取绝对值
System.Math.Max(a,b) a,b中较大数;System.Math.Min(a,b) a,b中较小数
Math.Log(a,b) 以b为底a的对数;Math.Sin(a) 弧度为a的正弦值
Math.PI π的数值;Math.E e的数值