【剑指offer Day18】55. 平衡二叉树的深度
原题链接
分析
建议结合二叉树的深度那一题来看。
比较容易想到的做法是:递归判断左右子树是否是平衡二叉树以及两棵树深度差是否<=1。但是这种做法时间复杂度
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN).
还有一种做法是后序遍历整棵树,在搜索过程中剪枝。搜索过程中如果子树不符合要求,则不用再做其他操作,返回表示错误的状态值-1。时间复杂度更优
O
(
N
)
O(N)
O(N) 。
代码
做法一:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int getDepth(TreeNode root){
if(root==null) return 0;
return Math.max(getDepth(root.left),getDepth(root.right))+1;
}
public boolean isBalanced(TreeNode root) {
if(root==null) return true;
int d1=getDepth(root.left);
int d2=getDepth(root.right);
if(Math.abs(d1-d2)<=1&&isBalanced(root.left)&&isBalanced(root.right)){
return true;
}
return false;
}
}
做法二:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int dfs(TreeNode root){
if(root==null) return 0;
int d1=dfs(root.left);
if(d1==-1) return -1;
int d2=dfs(root.right);
if(d2==-1) return -1;
if(Math.abs(d1-d2)<=1) return Math.max(d1,d2)+1;
else return -1;
}
public boolean isBalanced(TreeNode root) {
return dfs(root)!=-1;
}
}
今日motto
习惯将成为人的第二天性。