[LeetCode] 110. Balanced Binary Tree 平衡二叉树
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as:
a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
Example 1:
Given the following tree [3,9,20,null,null,15,7]
:
3 / \ 9 20 / \ 15 7
Return true.
Example 2:
Given the following tree [1,2,2,3,3,null,null,4,4]
:
1 / \ 2 2 / \ 3 3 / \ 4 4
Return false.
给定一个二叉树,判断是否高度平衡。高度平衡二叉树的定义:二叉树的任意节点的两个子树的深度差不超过1。
解法:根据定义,只需要判定一颗二叉树的左右子树高度的高度差是否小于等于1。递归处理每一颗二叉树左右子树的高度,并进行判断再回溯。
Java:
class Solution { int abs(int x) { return x > 0 ? x : -x; } int check(TreeNode* root) { if (!root) return NULL; int lch = check(root -> left); int rch = check(root -> right); // 检查子树是否存在不平衡 if (lch == -1 || rch == -1 || abs(lch - rch) > 1) return -1; // 返回当前子树高度 return (lch > rch ? lch : rch) + 1; } public: bool isBalanced(TreeNode* root) { return check(root) != -1; } };
Java: without ResultType
public class Solution { public boolean isBalanced(TreeNode root) { return maxDepth(root) != -1; } private int maxDepth(TreeNode root) { if (root == null) { return 0; } int left = maxDepth(root.left); int right = maxDepth(root.right); if (left == -1 || right == -1 || Math.abs(left-right) > 1) { return -1; } return Math.max(left, right) + 1; } }
Python:
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # @param root, a tree node # @return a boolean def isBalanced(self, root): return (self.getHeight(root) >= 0) def getHeight(self, root): if root is None: return 0 left_height, right_height = self.getHeight(root.left), self.getHeight(root.right) if left_height < 0 or right_height < 0 or abs(left_height - right_height) > 1: return -1 return max(left_height, right_height) + 1
Python:
class Solution: """ @param root: The root of binary tree. @return: True if this Binary tree is Balanced, or false. """ def isBalanced(self, root): balanced, _ = self.validate(root) return balanced def validate(self, root): if root is None: return True, 0 balanced, leftHeight = self.validate(root.left) if not balanced: return False, 0 balanced, rightHeight = self.validate(root.right) if not balanced: return False, 0 return abs(leftHeight - rightHeight) <= 1, max(leftHeight, rightHeight) + 1
C++:
class Solution { public: bool isBalanced(TreeNode *root) { if (!root) return true; if (abs(getDepth(root->left) - getDepth(root->right)) > 1) return false; return isBalanced(root->left) && isBalanced(root->right); } int getDepth(TreeNode *root) { if (!root) return 0; return 1 + max(getDepth(root->left), getDepth(root->right)); } };
C++:
class Solution { public: bool isBalanced(TreeNode *root) { if (checkDepth(root) == -1) return false; else return true; } int checkDepth(TreeNode *root) { if (!root) return 0; int left = checkDepth(root->left); if (left == -1) return -1; int right = checkDepth(root->right); if (right == -1) return -1; int diff = abs(left - right); if (diff > 1) return -1; else return 1 + max(left, right); } };
C++:
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: int depth(TreeNode *root) { if (root == NULL) { return 0; } int left = depth(root->left); int right = depth(root->right); if (left == -1 || right == -1 || abs(left - right) > 1) { return -1; } return max(left, right) + 1; } /** * @param root: The root of binary tree. * @return: True if this Binary tree is Balanced, or false. */ bool isBalanced(TreeNode *root) { return depth(root) != -1; } };