/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param pRoot TreeNode类 
        * @return bool布尔型
    */
    pub fn IsBalanced_Solution(&self, pRoot: Option<Box<TreeNode>>) -> bool {
        if pRoot.is_none() {
            return true;
        }
        let l =  pRoot.as_ref().unwrap().left.clone();
        let r =  pRoot.as_ref().unwrap().right.clone();
        if Solution::IsBalanced_Solution(self, l.clone()) && Solution::IsBalanced_Solution(self, r.clone()) {
            if (Solution::GetHeight(self, l)-Solution::GetHeight(self, r)).abs() <= 1 {
                return true;
            }
        }
        return false;
    }

    pub fn GetHeight(&self, node: Option<Box<TreeNode>>) -> i32 {
        if node.is_none() {
            return 0;
        }
        return 1 + std::cmp::max(Solution::GetHeight(self, node.as_ref().unwrap().left.clone()),
                                 Solution::GetHeight(self, node.as_ref().unwrap().right.clone()));
    }
}