バイナリ検索ツリー(BST)で再帰的なinorderを実装したいと思います。私は2つの構造体:Node
とTree
を使ってツリーを構築しました。私のコードは、これまでのところ、Node::inorder
の型の不一致のために働いていません。バイナリ検索ツリーの再帰的なinorderトラバーサル
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 }
}
pub fn inorder(&self) -> Vec<&T> {
self.root.as_ref().map(|n| n.inorder()).unwrap() // how to pass result ?
}
}
impl<T: Ord> Node<T> {
pub fn inorder(&self) -> Vec<&T> {
let mut result: Vec<&T> = Vec::new();
match *self {
None => return result,
Some(ref node) => {
let left_vec = node.left.inorder();
result.extend(left_vec);
result.extend(node.value);
let right_vec = node.right.inorder();
result.extend(right_vec);
}
}
}
}
これは、エラーレポートです:Node::inorder
で
error[E0308]: mismatched types
--> src/main.rs:27:13
|
27 | None => return result,
| ^^^^ expected struct `Node`, found enum `std::option::Option`
|
= note: expected type `Node<T>`
= note: found type `std::option::Option<_>`
error[E0308]: mismatched types
--> src/main.rs:29:13
|
29 | Some(ref node) => {
| ^^^^^^^^^^^^^^ expected struct `Node`, found enum `std::option::Option`
|
= note: expected type `Node<T>`
= note: found type `std::option::Option<_>`
、私は、ノードが存在しない場合は、空のベクトルを返すようにしたいです。ノードが存在するならば、私はベクトルをinorderで成長させて再帰させたいと思う。 match
はNode
とOption
の間では機能しませんが、それらの間のブリッジ方法はわかりません。
改善されたエラーメッセージを表示するには、Rustのバージョンをアップグレードする必要があります。私はこの質問を編集しましたが、読みやすいようになっています。 – Shepmaster