零、题目
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。
如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
一、理解题目
遇到题目时不要慌张,冷静审题,找到目的,理解正确再做题,不要靠臆想做题
预期:判断一个二叉树是否为平衡二叉树
how:怎样判断呢?其实题目已经给我们提示了,任意节点的左右子树的深度相差不超过1
关键字:树的深度
二、解析思路
这个题目就可以从计算树的深度入手
step1:计算树的左右子树的深度
step2:比较其深度是否超过1
step3:根据深度差获知是否是平衡二叉树
三、解题过程
方法1. 计算左右子树的深度
int CalcTreeLen(TreeNode * tree)
{
if(tree == NULL)
return 0;
return max(CalcTreeLen(tree->left), CalcTreeLen(tree->right))+1;
}
bool IsBalance(TreeNode * tree)
{
if(tree==NULL)
return true;
int nLeftLen = CalcTreeLen(tree->left);
int nRightLen = CalcTreeLen(tree->right);
if(nLeftLen-nRightLen>=-1 && nLeftLen-nRightLen<=1)
return IsBalance(tree->left) && IsBalance(tree->right);
return false;
}
方法2. 利用后序遍历计算左右子树的深度
因为方法1会重复计算一些节点的深度,所以思考是否存在其他方式计算某个节点一次
遍历树的方式一共有三种:根左右、左右根、左根右(对应前序遍历、后序遍历和中序遍历)。只有自底向上方法才能保证不会重复计算一些节点的深度,所以就采用后序遍历计算。
bool BalanceTree(TreeNode * tree, int * nDepth)
{
if(tree==NULL)
{
nDepth = 0;
return true;
}
int nLeft = 0, nRight = 0;
if(BalanceTree(tree->left, &nLeft) &&
BalanceTree(tree->right, &nRight))
{
if(nLeft > nRight)
nDepth= nLeft+1;
else
nDepth= nRight+1;
if(nLeft-nRight>=-1 && nLeft-nRight<=1)
return true;
else
return false;
}
return false;
}
bool IsBalance(TreeNode * tree)
{
if(tree == NULL)
return true;
return BalanceTree(tree);
}
To me:
1、不要背题,要理解啊
2、相信自己!