如何创建一个新的空树

时间:2016-12-02 07:16:54

标签: rust

我有一个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]

的错误

类型T不匹配类型None是否存在问题?

3 个答案:

答案 0 :(得分:5)

我会做类似的事情:

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

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

现在创建一个空的Tree很容易(仅None),因为它将两个Tree绑定到一个新的更大的。{/ p>

如果您不喜欢None - as-empty或根树中的框,您可以添加包装类型而不是别名Tree,但主要思路是相同的:将Option从左/右分支移动到节点类型。

答案 1 :(得分:5)

为什么不让你的Tree枚举而不是结构?

我要像这样创建二进制文件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),
        }
    }
}

答案 2 :(得分:2)

使用key: T,您明确要求输入T类型的值。您在初始化(key: None)中提供的内容是Option<U>,您需要为其提供一些值,例如将new更改为

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

或者,如果您还希望能够有时拥有密钥,有时却没有密钥,则可以将key字段更改为键入Option<T>