use std::rc::Rc;
use std::cell::RefCell;
type LNode = Box<ListNode>;
type TNode = Rc<RefCell<TreeNode>>;
impl Solution {
pub fn is_sub_path(head: Option<LNode>, root: Option<TNode>) -> bool {
fn check_subtree(head: Option<&LNode>, tree_node: Option<TNode>) -> bool {
if head.is_some() && tree_node.is_none() || head.is_none() && tree_node.is_some() {
return false;
}
if dfs(head, tree_node.as_ref().map(|tree_node| tree_node.clone())) {
return true;
}
let tree_node = tree_node.unwrap();
let tree_node = tree_node.borrow();
check_subtree(head, tree_node.left.clone()) || check_subtree(head, tree_node.right.clone())
}
fn dfs(list_node: Option<&LNode>, tree_node: Option<TNode>) -> bool {
match (list_node, tree_node) {
(None, _) => true,
(Some(_), None) => false,
(Some(list_node), Some(tree_node)) => {
let list_node_next = list_node.next.as_ref();
let tree_node = tree_node.borrow();
if list_node.val != tree_node.val {
return false;
}
dfs(list_node_next, tree_node.left.clone()) || dfs(list_node_next, tree_node.right.clone())
}
}
}
check_subtree(head.as_ref(), root)
}
}