第二題:平衡二叉樹

題目描述:輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。

              (如果某二叉樹爲空或其中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。)

思路分析:(使用了遞歸的方法,建議單步調試跟蹤代碼,需掌握二叉樹的遍歷)

後序遍歷 + 剪枝 (從底至頂)   此方法爲本題的最優解法
思路是對二叉樹做後序遍歷,從底至頂返回子樹深度,若判定某子樹不是平衡樹則 “剪枝” ,直接向上返回。
算法流程:

recur(root) 函數:

    返回值:
        當節點root 左 / 右子樹的深度差 ≤1:則返回當前子樹的深度,即節點 root 的左 / 右子樹的深度最大值+1( max(left, right) + 1 );
        當節點root 左 / 右子樹的深度差 >2:則返回 −1 ,代表 此子樹不是平衡樹 。
    終止條件:
        當 root 爲空:說明越過葉節點,因此返回高度 000 ;
        當左(右)子樹深度爲 −1 :代表此樹的 左(右)子樹 不是平衡樹,因此剪枝,直接返回 −1 ;

isBalanced(root) 函數:

    返回值: 若 recur(root) != -1 ,則說明此樹平衡,返回 true ; 否則返回 false 。

代碼實現:

    public static boolean isBalanced(TreeNode root) {
        return recur(root) != -1;
    }

    private static int recur(TreeNode root) {
        if (root == null)
            return 0;
        int left = recur(root.left);
        if (left == -1)
            return -1;
        int right = recur(root.right);
        if (right == -1)
            return -1;
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章