leetcode简单题20 N.101 对称二叉树 rust描述


 

// [1,2,2,3,4,4,3] true
// [1,2,2,null,3,null,3] false
use std::rc::Rc;
use std::cell::RefCell;
#[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
    }
  }
}
// 递归
pub fn is_symmetric(root: Option<Rc<RefCell<TreeNode>>>) -> bool {
    is_mirror(&root, &root)
}
// 递归的辅助函数,
fn is_mirror(
    left: &Option<Rc<RefCell<TreeNode>>>,
    right: &Option<Rc<RefCell<TreeNode>>>,
) -> bool {
    match (left, right) {
        (Some(left_node), Some(right_node)) => {
            let left_node = left_node.borrow();
            let right_node = right_node.borrow();
            left_node.val == right_node.val
                && is_mirror(&left_node.left, &right_node.right)
                && is_mirror(&left_node.right, &right_node.left)
        }
        (None, None) => true,
        _ => false,
    }
}
use std::collections::VecDeque;
// 迭代
pub fn is_symmetric2(root: Option<Rc<RefCell<TreeNode>>>) -> bool {
    if root.is_none() {
        return true;
    }

    let mut queue = VecDeque::new();
    queue.push_back(root.clone());
    queue.push_back(root.clone());

    while !queue.is_empty() {
        let left = queue.pop_front().unwrap();
        let right = queue.pop_front().unwrap();

        if left.is_none() && right.is_none() {
            continue;
        }

        if left.is_none() || right.is_none() {
            return false;
        }

        let left_node = left.as_ref().unwrap().borrow();
        let right_node = right.as_ref().unwrap().borrow();

        if left_node.val != right_node.val {
            return false;
        }

        queue.push_back(left_node.left.clone());
        queue.push_back(right_node.right.clone());
        queue.push_back(left_node.right.clone());
        queue.push_back(right_node.left.clone());
    }

    true
}
fn main() {
    // 根据 [1,2,2,3,4,4,3] true 编写测试用例
    let tree = Some(Rc::new(RefCell::new(TreeNode {
        val:1,
        left:Some(Rc::new(RefCell::new(TreeNode {
            val:2,
            left:Some(Rc::new(RefCell::new(TreeNode {
                val:3,
                left:None,
                right:None,
            }))),
            right:Some(Rc::new(RefCell::new(TreeNode {
                val:4,
                left:None,
                right:None,
            }))),
        }))),
        right:Some(Rc::new(RefCell::new(TreeNode {
            val:2,
            left:Some(Rc::new(RefCell::new(TreeNode {
                val:4,
                left:None,
                right:None,
            }))),
            right:Some(Rc::new(RefCell::new(TreeNode {
                val:3,
                left:None,
                right:None,
            }))),
        }))),
    })));
    assert_eq!(is_symmetric(tree.clone()), true);
    assert_eq!(is_symmetric2(tree.clone()), true);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值