BM36 题解 | #判断是不是平衡二叉树#
判断是不是平衡二叉树
https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222
心路历程:
判断二叉树,本质是判断单个二叉树的深度,使用的是后序遍历的方法,如何判断前序,中序,后序?
与左右递归和root调用的位置,有返回值的情况有关:
* 前序:if(root)返回值->if(左递归)返回值->if(右递归)返回值
* 中序:if(左递归)返回值->if(root)返回值->if(右递归)返回值
* 后序:if(左递归)返回值->if(右递归)返回值->if(root)返回值
解题思路:
二叉树深度遍历算法:
其实,深度遍历递归的过程中本就可以知道左右子树的高度,
所以在递归过程中,就可以利用这个left、right值做比较的,通过返回值增加返回负值,
来表示非平衡二叉树的情况,再层层往上抛得出结果就可以了。
我们就可以立刻知道这个树是不是就是平衡二叉树了!
具体的返回值解析:
dep == -1, 表示非平衡二叉树;
dep > 0, 平衡二叉树的高度;
int dep = int deep(TreeNode root) {
....
// 下面这句话的意思是:
// Math.abs(left-right)>1, 左右子树高度相差>1,非平衡二叉树,返回-1
// 否则,返回 Math.max(left,right)+1, 也就是当前树节点的高度
return Math.abs(left-right)>1 ?-1: Math.max(left,right)+1;
}
import java.util.*; public class Solution { /** * * @param pRoot TreeNode类 * @return bool布尔型 */ public boolean IsBalanced_Solution (TreeNode pRoot) { int dep = deep(pRoot); return dep<0?false:true; } /** * 深度探测是一种后序遍历二叉树的方法 * 怎么算前、中、后?就可以递归嵌套递归时 * 左右递归和root调用的位置,有返回值的情况 * * 前序:if(root)返回值->if(左递归)返回值->if(右递归)返回值 * * 中序:if(左递归)返回值->if(root)返回值->if(右递归)返回值 * * 后序:if(左递归)返回值->if(右递归)返回值->if(root)返回值 */ int deep(TreeNode root) { if(root == null) { return 0; } int left = deep(root.left); if(left<0) { return -1; } int right = deep(root.right); if(right<0) { return -1; } return Math.abs(left-right)>1 ?-1: Math.max(left,right)+1; } }