題目描述:輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。
(如果某二叉樹爲空或其中任意節點的左右子樹的深度相差不超過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; }