LeetCode 110 Balanced Binary Tree
===================
方法一:
平衡二叉树的判定,一般来说可以在TreeNode数据结构中增加一个depth表示以该节点为根节点的子树的深度,从而利用左右儿子节点子树深度的差值做判断。
注意这里的depth是子树的深度,而不是节点的深度,这两者是相反的。
这里由于无法修改数据结构,在每次判断子树深度时都调用一次dfs求取。不知道是否有更好的办法。
代码中的细节:
利用dfs实现子树深度的求取 ,父节点的depth为左右儿子节点max值+1。
public int dfs(TreeNode root) {
if (root == null) return 0;
else {
int h1 = dfs(root.left) + 1;
int h2 = dfs(root.right) + 1;
return (h1 > h2) ? h1 : h2;
}
}
注意递归的终止条件为root==null,若在该节点处左右子树平衡,则分别递归搜索左右子树是否平衡。
if (root == null) return true;
else {
int h1 = dfs(root.left);
int h2 = dfs(root.right);
if (h1 - h2 > 1 || h1 - h2 < -1) {
return false;
} else {
return isBalanced(root.left) && isBalanced(root.right);
}
}
具体代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
else {
int h1 = dfs(root.left);
int h2 = dfs(root.right);
if (h1 - h2 > 1 || h1 - h2 < -1) {
return false;
} else {
return isBalanced(root.left) && isBalanced(root.right);
}
}
}
public int dfs(TreeNode root) {
if (root == null) return 0;
else {
int h1 = dfs(root.left) + 1;
int h2 = dfs(root.right) + 1;
return (h1 > h2) ? h1 : h2;
}
}
}
方法二:
之前纠结了很久,因为方法一种dfs求height被反复调用,实际上一次dfs就可以判断子树是否平衡,那到底怎么在dfs中既返回depth又返回布尔型的是否平衡呢?
网上找到了一个很好的思路,用return -1代表不平衡,从而解决了int与boolean返回值无法同时返回的问题。
public class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
// If root is unbalanced, then getDepth will return -1; else, getDepth will return max depth
else return (getDepth(root) != -1);
}
public int getDepth(TreeNode root) {
if (root == null) return 0;
else {
int ld = getDepth(root.left);
int rd = getDepth(root.right);
if (ld == -1 || rd == -1 || Math.abs(ld - rd) > 1)
return -1;
else
return Math.max(ld,rd) + 1;
}
}
}