Rustのバイナリ検索ツリーの平衡型(AVL)バージョンのローテーションコードを実装しようとしていますが、再編成するノードの所有権を主張するのに問題があります。構造体内のボックス化された要素を再構成する
マイ構造:
struct Tree<T> {
root: Box<TreeNode<T>>,
depth: usize,
}
enum TreeNode<T> {
Empty,
Node {
val: T,
left: Tree<T>,
right: Tree<T>,
},
}
私は一種類のみ、またはOption
Sを使用することができます知っています。これは少し上手そうだった。私は、ノードを再割り当てする方法を見つけることができません
T1, T2, T3 and T4 are subtrees.
z y
/\ / \
y T4 Right Rotate (z) x z
/\ - - - - - - - - -> /\ /\
x T3 T1 T2 T3 T4
/\
T1 T2
:
私は回転を実装したい
。私はz
ノード(
Tree<T>
ノード)を呼び出す
rotate(&mut self, ...)
メソッドを持っていますが、コンポーネントを取得するには、
TreeNode
を
Node
バージョンにキャストするために
match *self.root {}
を使用する必要があります。それはうまくいきますが、抽出した値を使って新しいノードを作成することはできません。私はこれをしようとした場合
:
fn insert(&mut self, ...) {
...
// need to rotate
rotate(self, ...);
}
fn rotate(&mut ztree, ...) {
ztree.root = match *ztree.root {
// just re assign same tree to test...
TreeNode::Node {val, left, right} =>
Box::new(TreeNode::Node {val: val, left: left, right: right}),
_ => panic!("meh"),
} ...
私はこのエラーを取得します。
私はそれが私は箱入りTreeNode
上の所有権を取得するために好きではありませんが、私は、私は新しい箱入り
TreeNode
を割り当てるつもり錆を伝える方法がわからないと、古い
TreeNode
は可能性があることを理解
|
171 | ztree.root = match *ztree.root {
| ^^^^^ cannot move out of borrowed content
172 | TreeNode::Node {val, left, right} =>
| --- ---- ----- ...and here (use `ref right` or `ref mut right`)
| | |
| | ...and here (use `ref left` or `ref mut left`)
| hint: to prevent move, use `ref val` or `ref mut val`
ローカルで請求することができます。
私がself.root
を新しいボックスに再割り当てしようとしていることを知っているので、ちょうどうまく動作するようにしようとすると、前のボックスと参照されたヒープ構造体は割り当てを解除する必要があります。
[Rust playground link](https://play.rust-lang.org/?gist=6ef6b2355f5b12146f1232ac7ab72096&version=stable&backtrace=0)をご覧ください。たぶんあなたはあなたのケースに役立つでしょう。 – red75prime
私は、@ red75primeを参照してください、あなたはオプションを使用していると値を切り離すために取る。それは完全に私は完全に見落としている。私はそれがうまくいくと思います!私の分岐は異なります:左/右のオプションの代わりに、私は空ノードと "値"ノードを持っています。それにもかかわらず、私はオプションを使用して、価値を取り、それをどこかに置くことができます。 ありがとう、私は完全にそれを受け入れるだろうと答えを作成することを検討してください。 – helios
また、https://stackoverflow.com/questions/16504643/what-is-the-overhead-of-rusts-option-typeで説明されているように、Optionはポインタに余分なサイズを追加しないので、Option>はボックス。余計なことではありません。知っておいてよかった!そうすれば、私は "典型的な"ポインタが必要なときはいつでもオプションを使うことができます。値を受け取り、それを動かすことができます。 –
helios