用到了之前计算二叉树的深度的函数
并且首先要知道平衡二叉树具有什么特征:
1.平衡二叉树的左子树深度-右子树深度<=1
2.平衡二叉树的左右子树均为平衡二叉树
方法一:
因此这又是一个用到了递归的程序
本来我想的是这样的,但是结果却没有体现出来递归的形式,导致结果出错,因此还是要加强对递归的理解以及使用,多练习吧
class Solution {
public:
int Depth(TreeNode* pRoot)
{
if(pRoot==NULL)
return 0;
int depth = 0;
int left=Depth(pRoot->left);
int right=Depth(pRoot->right);
depth =(left>right)?(left+1):(right+1) ;
return depth ;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL)
return true;
int left=Depth(pRoot->left);
int right=Depth(pRoot->right);
int diff=left-right;
if(diff>1||diff<-1)
return false;
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
}
};
方法二:
优势在于只对每个结点遍历了一次,但是我自己并没有看懂。。
用后序遍历的方式,一边遍历一边判断结点是不是平衡的
为啥我没看出来??!!!
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot, int *depth)
{
if(pRoot==NULL){
*depth = 0;
return true;
}
int left=0,right=0;
if(IsBalanced_Solution(pRoot->left, &left)&&IsBalanced_Solution(pRoot->right, &right)){
int diff=left-right;
if(diff<=1&&diff>=-1){
*depth = 1+(left>right?left:right);
return true;
}
}
return false;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth = 0;
return IsBalanced_Solution(pRoot, &depth);
}
};
由于理解的不够深刻,专门作图,一步步验证分析,就是为了弄清楚其中的原理
然后回头重读代码,从例子入手分析每一句代码的道理所在
利用C++函数特性:函数名可以一样,只要参数不同,根据所传参数的类型来判断是调用哪一个函数
笔记及整个思想框图如下: