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

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);
}
相关推荐
SweetCode10 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…23 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong23 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
Source.Liu33 分钟前
【学Rust写CAD】28 带 Alpha 通道的双线性插值函数(bilinear_interpolation_alpha.rs)
rust
Source.Liu36 分钟前
【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
后端·rust·cad
yinhezhanshen40 分钟前
理解rust里面的copy和clone
开发语言·后端·rust
惊鸿.Jh43 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L43 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习