修仙公元2022年,一男子试图突破二叉树大关,遇一问题:
给定一个二叉树的根节点,请判断是否为平衡二叉树(左右节点的高度绝对子小于等于1)。
该男子使用层序遍历大法,信誓旦旦的前往考核地点。
结果可想而自:
啊——咚——啃——!!
以失败告终。。。。
最终求助于深山老者,得一秘籍:
老者问题:何为平衡二叉树?
男子答曰:其左右节点高度相减,绝对值小于等于1着为平衡二叉树、
老者再问:何为二叉树高度?
男子复答曰:一节点左右节点皆为null,高度则为1,再往上一层则+1、
老者抚理胡须曰:很好!我这里有一本平衡二叉树秘籍,我与你有缘,赠送与你,望发扬光大!
老者说完,化作一缕青烟消失在时空当中————
———————————————————————————————————————————
坑爹书籍之一,就一张纸。。。。。。
不过聪明的男子看出了其中的奥秘!
首先确定递归的参数:传入节点
确定返回值:每层的高度,int
递归条件:不为空时。
还有一些细节:
这里我们将返回值为-1定为此二叉树不为平衡二叉树。
public boolean isBalanced(TreeNode root) {
return dfs(root)==-1?false:true;
}
int dfs(TreeNode root){
if(root==null){
return 0;
}
int l=dfs(root.left);
if(l==-1){
return -1;
}
int r=dfs(root.right);
if(r==-1){
return -1;
}
return Math.abs(l-r)>1?-1:1+Math.max(l,r);
}
当左右节点任何一个节点返回-1时,就说明下面已经不满足平衡二叉树的定义了,就可以继续返回-1了。
第二点:下一层的高度是等于本层左右节点最大值+1.这里大家画一个二叉树,从下往上画一遍就懂了。
男子一脸骄傲的样子,兴冲冲跑去测试,过了!
结果门后还有门,无穷无尽,男子当场暴毙!卒!
结章——