0

私は TreeList を書く方法を試みてきましたが、失敗したので、グーグルで調べてそこから学びませんでした。それはうまくいきますが、私が今やろうとしているのは、TreeListを分割する方法です。2 つの例を作成しましたが、どちらも失敗しました。プログラムがクラッシュするだけです。私は Java を使用しており、基にしている TreeList クラスはhttp://yet-another-tree-structure.googlecode.com/svn/trunk/java/src/com/tree/です。

オリジナルのもの

public TreeNode<T> removeAndCreate() {
    TreeNode<T> tn = new TreeNode<T>(data);
    tn.children = children;
    tn.elementsIndex = elementsIndex;
    elementsIndex.remove(this);
    children.remove(this);
    return tn;
}

私が使用している新しいもの

public TreeNode<T> split() {
    TreeNode<T> tP = parent;
    while (tP.isRoot() == false) {
        tP = tP.parent;
    }
    TreeNode<T> tn = new TreeNode<T>(data);
    tn.children = children;
    tn.elementsIndex = elementsIndex;
    tP.elementsIndex.remove(this);
    tP.children.remove(this);
    return tn;
}

事前にご支援いただきありがとうございます。

4

1 に答える 1

0

基づいているクラスと 2 番目の分割を確認した後、分割とは、問題のノードを現在のツリーから取り出し、問題のノードをルートとして新しいツリーを返すことを意味すると仮定します。それがあなたの求めているものである場合、いくつかの修正が必要です。まず、split関数は次のことを行います。

TreeNode<T> tP = parent;
while (tP.isRoot() == false) {
    tP = tP.parent;
}

問題は、現在のノード ( this) に がないparent場合、Null 例外がスローされることです (したがって、ルート ノードを分割してみてください。エラーが発生するはずです)。私はあなたが意味したと思います:

TreeNode<T> tP = this;

parentこの変更により、である可能性のある にアクセスするループが回避されますnullelementsIndex次に、以上の各レベルの をすべて削除する必要がありますparent。次にchildren、ダイレクトからを削除するparent必要があります ( がある場合parent)。

あなたが探しているかもしれないコードは以下だと思います(私が何かを見逃していないと仮定して):

public TreeNode<T> split() {
    // Create a new root node for the tree we split off
    TreeNode<T> tn = new TreeNode<T>(data);
    tn.children = children;
    tn.elementsIndex = elementsIndex;

    // For each level of the tree above us make sure we remove
    // ourselves from the elementsIndex at EACH LEVEL until we
    // finish at the root.
    TreeNode<T> tP = this;
    while (tP.isRoot() == false) {
        tP = tP.parent;
        tP.elementsIndex.remove(this);
    }

    // If this node has a parent remove this node as one of
    // our parent's children. We aren't the child of any of the
    // levels above our parent
    if (parent != null)
        this.parent.children.remove(this);

    // Return the root of the newly split tree
    return tn;
}
于 2014-09-13T08:10:03.827 に答える