美文网首页
LeetCode 110 Balanced Binary Tre

LeetCode 110 Balanced Binary Tre

作者: ShuiLocked | 来源:发表于2016-07-19 23:24 被阅读422次

    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 Tre

          本文链接:https://www.haomeiwen.com/subject/gvcvjttx.html