LeetCode 110 Balanced Binary Tree

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;
        }
    }
    
}

你可能感兴趣的:(LeetCode 110 Balanced Binary Tree)