第587题-打印二叉树的所有可能路径
问题描述
这道题很简单,要求给定一颗二叉树,返回所有可能的路径,思路就是深度优先搜索,考察的是基本功,看起来没什么trick
rust语言实现
use std::cell::RefCell;
use std::fmt::Debug;
use std::rc::Rc;
#[derive(Debug)]
pub struct TreeNode<T: Ord + Debug + Clone> {
pub elem: T,
pub left: Link<T>,
pub right: Link<T>,
}
type Link<T> = Option<Rc<RefCell<TreeNode<T>>>>;
impl<T: Ord + Debug + Clone> TreeNode<T> {
pub fn new(t: T) -> Self {
TreeNode {
elem: t,
left: None,
right: None,
}
}
pub fn dfs_helper(
root: Option<&Rc<RefCell<TreeNode<T>>>>,
mut cur: Vec<T>,
res: &mut Vec<Vec<T>>,
) {
if let Some(root_node) = root {
cur.push(root_node.borrow().elem.clone());
if root_node.borrow().left.is_none() && root_node.borrow().right.is_none() {
res.push(cur); // reached the end, stop recursive
} else {
Self::dfs_helper(root_node.borrow().left.as_ref(), cur.clone(), res);
Self::dfs_helper(root_node.borrow().right.as_ref(), cur, res);
}
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_dfs() {
let mut n1 = TreeNode::new(1);
let n2 = TreeNode::new(2);
let mut n3 = TreeNode::new(3);
let n4 = TreeNode::new(4);
let n5 = TreeNode::new(5);
n3.left = Some(Rc::new(RefCell::new(n4)));
n3.right = Some(Rc::new(RefCell::new(n5)));
n1.left = Some(Rc::new(RefCell::new(n2)));
n1.right = Some(Rc::new(RefCell::new(n3)));
let mut res: Vec<Vec<i32>> = vec![];
TreeNode::dfs_helper(Some(&Rc::new(RefCell::new(n1))), vec![], &mut res);
assert_eq!(vec![vec![1, 2], vec![1, 3, 4], vec![1, 3, 5]], res);
}
}
代码不难,最多的地方应该是在构造这棵二叉树上,因为不是二叉搜索树,所以构造起来稍微复杂点。构造完了之后就用深度优先搜索去遍历,深搜是一个递归算法,具体思路是如果当前节点是叶子节点,则递归终止,如果有左子树,则递归搜索左子树,如果有右子树则递归搜索右子树
Last updated