2016-12-02 5 views
1

私にはTreeがあり、新しい空のツリーを作成したいと思います。私の最初の考えは次のとおりです。新しい空のツリーを作成する方法

struct Tree<T> { 
    key: T, 
    l: Option<Box<Tree<T>>>, 
    r: Option<Box<Tree<T>>>, 
} 

impl<T: Ord> Tree<T> { 
    /// Creates an empty tree 
    pub fn new() -> Self { 
     Tree { 
      key: None, // error of mismatch type 
      l: None, 
      r: None, 
     } 
    } 
} 

私はError: mismatched types [E0308]

のエラーは、それがタイプNoneと一致しないタイプTの問題であり得ますか?

+0

'NONE'は**ない**タイプです。それは 'Option'型の* value *です。 – Shepmaster

答えて

5

を入力するkeyフィールドを変更することができますNone)、それは2つの新しい大きなものに2つを結合するためです。

あなたはNone -as-空またはルートツリー内のボックスが気に入らない場合は、代わりにエイリアスTreeのラッパー型を追加することもできますが、主な考え方は同じである:左からOptionを移動/ rightはノードタイプに分岐します。

2

key: Tの場合、明示的にタイプTの値を要求しています。あなたは、初期化(key: None)に与えたことは、あなたがまた時々鍵を持っている能力をしたい場合は、代わりに

pub fn new(t: T) -> Self { 
    Tree { 
     key: t, 
     l: None, 
     r: None, 
    } 
} 

newを変更することにより、例えば、それにいくつかの値を与える必要があり、Option<U>あり、時にはありませんちょうど(空Treeが簡単です

type Tree<T> = Option<Box<TreeNode<T>>>; 

struct TreeNode<T> { 
    key: T, 
    l: Tree<T>, 
    r: Tree<T>, 
} 

今すぐ作成:あなたは私のような何かをしたいOption<T>

5

structの代わりにTreeをenumにしてみませんか?

私はこのようなバイナリTreeを作成したい:

enum Tree<T> { 
    Empty, 
    Node { 
     val: T, 
     l: Box<Tree<T>>, 
     r: Box<Tree<T>>, 
    }, 
} 

あなたは、このようにそれを実現することができます。

impl<T: Ord> Tree<T> { 
    fn empty() -> Self { 
     Tree::Empty 
    } 
    fn singleton(val: T) -> Self { 
     Tree::Node { 
      val: val, 
      l: Box::new(Tree::Empty), 
      r: Box::new(Tree::Empty), 
     } 
    } 
} 
関連する問題