私はjavascriptでバイナリ検索ツリーを表すプログラムを作成しています。私が望むのは、両方のptrs(左、右)をnullとして共通のツリーノードを作成する方法です。ここで
javascriptで自己定義オブジェクトの共通定数インスタンスを作成するには?
var BST = function(data) {
if (data === null || data === undefined){
this.data = null;
this.left = null;
this.right = null;
}
else{
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
};
BST.prototype.insert = function(data) {
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
else if (data < this.data)
this.left.insert(data);
else if (data > this.data)
this.right.insert(data);
};
BST.prototype.inOrder = function(func) {
if (this.data !== null) {
this.left.inOrder(func);
func(this.data);
this.right.inOrder(func);
}
};
が、私は(if(data === null || data === undefined)
条件で定義されている)はnullノードとすべてのNULLポインタを割り当てたい:これは私が書いたコードです。しかし、すべてのヌル・ノードに対して、同じデータを表す新しいノードを作成する必要があります。 nullノードの共通インスタンスに割り当てる方法はありますか?私がnullノードを使用するだけではなく
else{
this.data = data;
this.left = null;
this.right = null;
}
を使用して
理由は、それがあるためnull.inOrder(func);
を実行しようとするためleft or right = null
でノードに到達すると、inOrder
メソッドを呼び出すには、それはTypeError
を与えることthis.left
並進ありますnull
。
これは、inOrder
関数を変更することです。これは、各文の周りに多くの条件をもたらします。つまり、非常に洗練された実装ではありません。
また、オブジェクトのプロトタイプの外側にinOrder
を定義して、それを引数としてツリーにすることもできますが、それはやりたくありません。
また、コードの2番目の改善点として、insert
メソッドを検討してください。 null
場合:私は
if (this.data === null)
this = new BST(data);
:私はとにかく各エントリを上書きする必要があるため
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
、私はの線に沿って何かをすることによって全く新しいツリーに、このノードを再割り当てしますこれは前者の実装が効率的ではないことを認識していますが、まだまだ簡潔です。そうする方法はありますか?
「this」に割り当てることはできません。代わりに、親ノードを操作する必要があります。 – Bergi