私はjavascriptで二分探索木を表すプログラムを作成しています。私が欲しいのは、両方のptrs(左、右)をnullとして持つ共通のツリーノードを作成する方法です。これは私が書いたコードです:
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);
}
};
ここでは、すべてのnullポインターにnullノード(条件で定義されている)を割り当てたいと思いますif(data === null || data === undefined)
。ただし、nullノードごとに、同じデータを表す新しいノードを作成する必要があります。nullノードの共通インスタンスに割り当てる方法はありますか?
単に使用する代わりにnullノードを使用する理由
else{
this.data = data;
this.left = null;
this.right = null;
}
メソッドを呼び出すと、inOrder
でノードに到達するとleft or right = null
、それ以降TypeError
に実行しようとするため、がに変換されます。
それを回避する方法は、関数を変更することです。これにより、各ステートメントの周りに多くの条件が発生します。つまり、あまり洗練された実装ではありません。オブジェクトのプロトタイプの外部で
定義し、引数としてツリーを使用するようにすることもできますが、それはしたくありません。 null.inOrder(func);
this.left
null
inOrder
inOrder
inOder(tree,func)
また、コードの2番目の改善点として、insert
メソッドを検討してください。場合 null
:
if (this.data === null){
this.data = data;
this.left = new BST(null);
this.right = new BST(null);
}
とにかく各エントリをオーバーライドする必要があるため、次の行に沿って何かを実行して、このノードを新しいツリーに完全に再割り当てします。
if (this.data === null)
this = new BST(data);
これは前者よりも効率の悪い実装になることは承知していますが、それでもはるかに簡潔です。そうする方法はありますか?