// [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]);
}
leetcode简单题18 N.94 二叉树的中序遍历 rust描述
于 2024-07-09 23:55:15 首次发布