leetcode简单题18 N.94 二叉树的中序遍历 rust描述

// [1,null,2,3] [1,3,2]
use std::rc::Rc;
use std::cell::RefCell;
//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
    }
  }
}
//递归
pub fn inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
    fn inorder(node: Option<Rc<RefCell<TreeNode>>>, result: &mut Vec<i32>) {
        if let Some(n) = node {
            inorder(n.borrow().left.clone(), result);
            result.push(n.borrow().val);
            inorder(n.borrow().right.clone(), result);
        }
    }

    let mut result = Vec::new();
    inorder(root, &mut result);
    result
}
//迭代
pub fn inorder_traversal2(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
    let mut stack = Vec::new();
    let mut result = Vec::new();
    let mut current = root;

    while current.is_some() || !stack.is_empty() {
        while let Some(node) = current {
            stack.push(node.clone());
            current = node.borrow().left.clone();
        }

        if let Some(node) = stack.pop() {
            result.push(node.borrow().val);
            current = node.borrow().right.clone();
        }
    }

    result
}

fn main() {
    // 根据 [1,null,2,3] [1,3,2] 编写测试用例
    let root = Some(Rc::new(RefCell::new(TreeNode {
        val:1,
        left:None,
        right: Some(Rc::new(RefCell::new(TreeNode {
            val: 2,
            left: Some(Rc::new(RefCell::new(TreeNode {
                val: 3,
                left: None,
                right: None,
            }))),
            right: None,
        })))}
    )));
    assert_eq!(inorder_traversal(root.clone()), vec![1, 3, 2]);
    assert_eq!(inorder_traversal2(root.clone()), vec![1, 3, 2]);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值