leetcode简单题23 N.110 平衡二叉树 rust描述


 

// [3,9,20,null,null,15,7] true
// [1,2,2,3,3,null,null,4,4] false
// [] true
// Definition for a binary tree node.
#[derive(Debug, PartialEq, Eq)]
pub struct TreeNode {
  pub val: i32,
  pub left: Option<Rc<RefCell<TreeNode>>>,
  pub right: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
  #[inline]
  pub fn new(val: i32) -> Self {
    TreeNode {
      val,
      left: None,
      right: None
    }
  }
}

use std::rc::Rc;
use std::cell::RefCell;


pub fn is_balanced(root: Option<Rc<RefCell<TreeNode>>>) -> bool {
    // Helper function to determine height and if the subtree is balanced
    fn check_height_and_balance(node: &Option<Rc<RefCell<TreeNode>>>) -> (bool, i32) {
        if let Some(node) = node {
            let left = check_height_and_balance(&node.borrow().left);
            let right = check_height_and_balance(&node.borrow().right);

            let is_balanced = left.0 && right.0 && (left.1 - right.1).abs() <= 1;
            let height = 1 + left.1.max(right.1);

            (is_balanced, height)
        } else {
            (true, 0)
        }
    }

    check_height_and_balance(&root).0
}
fn build_tree(values: Vec<Option<i32>>) -> Option<Rc<RefCell<TreeNode>>> {
    if values.is_empty() {
        return None;
    }

    let root = Rc::new(RefCell::new(TreeNode::new(values[0].unwrap())));
    let mut queue = vec![Rc::clone(&root)];
    let mut i = 1;

    while i < values.len() {
        let current = queue.remove(0);
        if let Some(val) = values[i] {
            let left_node = Rc::new(RefCell::new(TreeNode::new(val)));
            current.borrow_mut().left = Some(Rc::clone(&left_node));
            queue.push(left_node);
        }
        i += 1;

        if i < values.len() {
            if let Some(val) = values[i] {
                let right_node = Rc::new(RefCell::new(TreeNode::new(val)));
                current.borrow_mut().right = Some(Rc::clone(&right_node));
                queue.push(right_node);
            }
            i += 1;
        }
    }

    Some(root)
}
fn main() {
    let tree = build_tree(vec![Some(3), Some(9), Some(20), None, None, Some(15), Some(7)]);
    assert_eq!(is_balanced(tree), true);

    let tree = build_tree(vec![Some(1), Some(2), Some(2), Some(3), Some(3), None, None, Some(4), Some(4)]);
    assert_eq!(is_balanced(tree), false);

    let tree = build_tree(vec![]);
    assert_eq!(is_balanced(tree), true);
}

相关推荐

  1. [leetcode] 110. 平衡

    2024-07-14 11:46:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 11:46:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 11:46:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 11:46:02       58 阅读
  4. Python语言-面向对象

    2024-07-14 11:46:02       69 阅读

热门阅读

  1. 数仓工具—Hive基础之临时表及示例

    2024-07-14 11:46:02       23 阅读
  2. 用C在安卓手机上开发

    2024-07-14 11:46:02       28 阅读
  3. sqlserver 表大小查询

    2024-07-14 11:46:02       21 阅读
  4. Nginx源码安装

    2024-07-14 11:46:02       21 阅读
  5. 使用Windows.size()定义窗口大小

    2024-07-14 11:46:02       16 阅读
  6. C#字符串

    2024-07-14 11:46:02       21 阅读
  7. Ansible 安装及使用说明

    2024-07-14 11:46:02       26 阅读
  8. PyCharm 查找功能指南

    2024-07-14 11:46:02       26 阅读
  9. 简单理解跨域

    2024-07-14 11:46:02       38 阅读
  10. PHP MySQL 创建数据库

    2024-07-14 11:46:02       23 阅读
  11. 速盾:cdn加速端口映射?

    2024-07-14 11:46:02       17 阅读