leetcode简朴题20 N.101 对称二叉树 rust形貌

饭宝  论坛元老 | 2024-7-16 19:38:22 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1651|帖子 1651|积分 4953

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

 
  1. // [1,2,2,3,4,4,3] true
  2. // [1,2,2,null,3,null,3] false
  3. use std::rc::Rc;
  4. use std::cell::RefCell;
  5. #[derive(Debug, PartialEq, Eq)]
  6. pub struct TreeNode {
  7.   pub val: i32,
  8.   pub left: Option<Rc<RefCell<TreeNode>>>,
  9.   pub right: Option<Rc<RefCell<TreeNode>>>,
  10. }
  11. impl TreeNode {
  12.   #[inline]
  13.   pub fn new(val: i32) -> Self {
  14.     TreeNode {
  15.       val,
  16.       left: None,
  17.       right: None
  18.     }
  19.   }
  20. }
  21. // 递归
  22. pub fn is_symmetric(root: Option<Rc<RefCell<TreeNode>>>) -> bool {
  23.     is_mirror(&root, &root)
  24. }
  25. // 递归的辅助函数,
  26. fn is_mirror(
  27.     left: &Option<Rc<RefCell<TreeNode>>>,
  28.     right: &Option<Rc<RefCell<TreeNode>>>,
  29. ) -> bool {
  30.     match (left, right) {
  31.         (Some(left_node), Some(right_node)) => {
  32.             let left_node = left_node.borrow();
  33.             let right_node = right_node.borrow();
  34.             left_node.val == right_node.val
  35.                 && is_mirror(&left_node.left, &right_node.right)
  36.                 && is_mirror(&left_node.right, &right_node.left)
  37.         }
  38.         (None, None) => true,
  39.         _ => false,
  40.     }
  41. }
  42. use std::collections::VecDeque;
  43. // 迭代
  44. pub fn is_symmetric2(root: Option<Rc<RefCell<TreeNode>>>) -> bool {
  45.     if root.is_none() {
  46.         return true;
  47.     }
  48.     let mut queue = VecDeque::new();
  49.     queue.push_back(root.clone());
  50.     queue.push_back(root.clone());
  51.     while !queue.is_empty() {
  52.         let left = queue.pop_front().unwrap();
  53.         let right = queue.pop_front().unwrap();
  54.         if left.is_none() && right.is_none() {
  55.             continue;
  56.         }
  57.         if left.is_none() || right.is_none() {
  58.             return false;
  59.         }
  60.         let left_node = left.as_ref().unwrap().borrow();
  61.         let right_node = right.as_ref().unwrap().borrow();
  62.         if left_node.val != right_node.val {
  63.             return false;
  64.         }
  65.         queue.push_back(left_node.left.clone());
  66.         queue.push_back(right_node.right.clone());
  67.         queue.push_back(left_node.right.clone());
  68.         queue.push_back(right_node.left.clone());
  69.     }
  70.     true
  71. }
  72. fn main() {
  73.     // 根据 [1,2,2,3,4,4,3] true 编写测试用例
  74.     let tree = Some(Rc::new(RefCell::new(TreeNode {
  75.         val:1,
  76.         left:Some(Rc::new(RefCell::new(TreeNode {
  77.             val:2,
  78.             left:Some(Rc::new(RefCell::new(TreeNode {
  79.                 val:3,
  80.                 left:None,
  81.                 right:None,
  82.             }))),
  83.             right:Some(Rc::new(RefCell::new(TreeNode {
  84.                 val:4,
  85.                 left:None,
  86.                 right:None,
  87.             }))),
  88.         }))),
  89.         right:Some(Rc::new(RefCell::new(TreeNode {
  90.             val:2,
  91.             left:Some(Rc::new(RefCell::new(TreeNode {
  92.                 val:4,
  93.                 left:None,
  94.                 right:None,
  95.             }))),
  96.             right:Some(Rc::new(RefCell::new(TreeNode {
  97.                 val:3,
  98.                 left:None,
  99.                 right:None,
  100.             }))),
  101.         }))),
  102.     })));
  103.     assert_eq!(is_symmetric(tree.clone()), true);
  104.     assert_eq!(is_symmetric2(tree.clone()), true);
  105. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表