Я хочу построить дерево, используя только две структуры: Node
и Tree
, а затем рекурсивно искать целевой узел из дерева. Если цель найдена, верните true
, иначе верните false
.Рекурсивный поиск узла в дереве
Задача для меня здесь заключается в том, как рекурсивно вызвать функцию find
, поскольку она определена только на Tree
не Node
.
pub struct Node<T> {
value: T,
left: Option<Box<Node<T>>>,
right: Option<Box<Node<T>>>,
}
pub struct Tree<T> {
root: Option<Box<Node<T>>>,
}
impl<T: Ord> Tree<T> {
/// Creates an empty tree
pub fn new() -> Self {
Tree { root: None }
}
// search the tree
pub fn find(&self, key: &T) -> bool {
let root_node = &self.root; // root is Option
match *root_node {
Some(ref node) => {
if node.value == *key {
return true;
}
let target_node = if *key < node.value {
&node.left
} else {
&node.right
};
match *target_node {
Some(sub_node) => sub_node.find(key),
None => {
return false;
}
}
}
None => return false,
}
}
}
fn main() {
let mut mytree: Tree<i32> = Tree::new();
let node1 = Node {
value: 100,
left: None,
right: None,
};
let boxed_node1 = Some(Box::new(node1));
let root = Node {
value: 200,
left: boxed_node1,
right: None,
};
let boxed_root = Some(Box::new(root));
let mytree = Tree { root: boxed_root };
let res = mytree.find(&100);
}
текущий код сообщает об ошибке:
error: no method named `find` found for type `Box<Node<T>>` in the current scope
--> src/main.rs:36:48
|
36 | Some(sub_node) => sub_node.find(key),
| ^^^^
|
= note: the method `find` exists but the following trait bounds were not satisfied: `Node<T> : std::iter::Iterator`
= help: items from traits can only be used if the trait is implemented and in scope; the following traits define an item `find`, perhaps you need to implement one of them:
= help: candidate #1: `std::iter::Iterator`
= help: candidate #2: `core::str::StrExt`
Я понимаю, что find
реализован только на Tree
, так что это ошибка, но я не думаю, что это эффективно реализовать find
на оба Tree
и Node
. Любой намек на это?
Например, target_node.as_ref() преобразовать ссылку (& Tree) в? (& T) – enaJ
@enaJ обновлено с более длинным объяснением. – Shepmaster
Я удалил свой первый вопрос с комментариями, так как мне было неприятно спрашивать слишком много ... Не ожидал, что вы все еще это увидите и ответьте на все. Благодаря! – enaJ