Javaはバイナリ検索ツリーを実装し、ツリーの操作を検索、挿入、削除します(マージと削除、コピー、削除)
まず、次のように、コーディングのアイデアが必要です。
1。検索:バイナリ検索ツリーのデータ特性によれば、ノードの値の比較に基づいて検索を実現できます。検索値が現在のノードよりも大きい場合は、右に進み、その逆になります!
2。挿入:挿入されたすべてがリーフノードであることを知っている必要があるため、挿入する葉のノードの位置を見つける必要があり、挿入アイデアは検索アイデアと一致しています。
3。削除:
1)マージと削除:一般的に言えば、次の状況に遭遇します。削除されたノードには左サブツリーがありますが、右サブツリーはありません。この時点で、現在のノードの親ノードは、現在のノードの左サブツリーを指す必要があります。削除されたノードに右サブツリーがあるが、左サブツリーがない場合、現在のノードの親ノードは右サブツリーを指す必要があります。削除されたノードに左サブツリーと右サブツリーがある場合、削除されたノードの左サブツリーの右端ノードを見つけてから、このノードの右または左の「ポインター」を削除したノードの右サブツリーのポイントにします。
2)コピーと削除:コピーと削除は比較的単純な削除操作であり、最も一般的に使用される削除操作でもあります。およそ3つの状況があります。現在のノードに左サブツリーがなく、右サブツリーがある場合、現在の右サブツリーのルートノードが削除されたノードを置き換えます。現在のノードに右サブツリーがなく、左サブツリーがある場合は、現在の左サブツリーのルートノードを削除し、削除したノードを置き換えます。現在削除されたノードに左サブツリーと右サブツリーの両方がある場合、削除されたノードのサブツリーを見つけて、左サブツリーの右端ノードを見つけて、このノードの値を削除したノードに割り当てる必要があります。処理する)。また、このプロセスを、現在削除されているノードの右サブツリーの左端ノードにスタンドアロンノードとして実装することもできます。
次に、コードを追加しましょう。
まず、##バイナリ検索ツリーノードクラス##
パッケージSearchBinaryTree; public class searchBinaryTreenode <t> {t data; public searchbinarytreenode <t> leftchild; public searchbinarytreenode <t> rightchild; public searchbinarytreenode(){this.data = null; this.leftchild = this.rightchild = null; } public searchBinaryTreenode(t da){this.data = da; this.leftchild = this.rightchild = null; } public searchBinaryTreenode(t da){this.data = da; this.leftchild = this.rightchild = null; } public searchbinaryTreenode(t da、searchbinarytreenode <t>左、searchbinarytreenode <t>右){this.data = da; this.leftchild = left; this.rightchild = right; } public t getData(){return data; } public void setData(t data){this.data = data; } public searchbinarytreenode <t> getLeftChild(){return leftchild; } public void setLeftChild(searchbinarytreenode <t> leftchild){this.leftchild = leftchild; } public searchbinarytreenode <t> getRightChild(){return rightchild; } public void setrightchild(searchbinarytreenode <t> rightchild){this.rightchild = rightchild; } public boolean isleaf(){if(this.leftchild == null && this.rightchild == null){return true; } falseを返します。 }}バイナリ検索ツリーの実装
パッケージSearchBinaryTree; public class searchBinaryTree <T> {searchBinaryTreenode <T> root; public boolean isempty(){if(root == null){return true; } falseを返します。 } public void visit(searchbinarytreenode <t> root){if(root == null){system.out.println( "このツリーは空です!"); } system.out.println(root.getData()); } public searchbinarytreenode <t> getRoot(){if(root == null){root = new searchbinarytreenode <t>(); }ルートを返します。 } public searchbinarytree(){this.root = null; } /**バイナリツリーを作成* / public void createTree(searchbinaryTreenode <t> node、t data){if(root == null){root = new searchbinarytreenode <t>(); } else {if(math.random()> 0.5){//ランダムな方法でバイナリツリーを作成するif(node.leftchild == null){node.leftchild = new searchbinarytreenode <t>(data); } else {createTree(node.leftchild、data); }} else {if(node.rightChild == null){node.rightChild = new searchbinarytreenode <t>(data); } else {createTree(node.rightchild、data); }}}}}} /** 2番目の検索検索ツリーで検索* / public searchbinaryTreenode <t> search(searchbinarytreenode <t> root、t value){searchbinarytreenode <t> current = root; while((root!= null)&&(current.getData()!= value)){// Javaのジェネリックはサイズを比較できないことに注意する必要があります。実際に使用すると、一般的なデータ型を使用してこの汎用を置き換えることができるため、エラーはありません。 current =(value <current.getData()?search(current.leftchild、value):search(current.rightchild、value)); } return current; } public searchBinaryTreenode <t> insertNode(t value){searchbinarytreenode <t> p = root、pre = null; while(p!= null){pre = p; // Javaのジェネリックはサイズを比較できないことに注意する必要があります。実際に使用すると、一般的なデータ型を使用してこの汎用を置き換えることができます。そうすれば、(p.getdata()<value){p = p.rightchild; } else {p = p.leftchild; }} if(root == null){root = new searchbinarytreenode <t>(value); } else if(pre.getData()<value){pre.rightChild = new SearchBinaryTreenode <T>(value); } else {pre.leftchild = new searchbinarytreenode <t>(value); }} /** merge and delete* / public void deleteBymerging(searchbinarytreenode <t> node){searchbinarytreenode <t> temp = node; if(node!= null){//削除されたノードに右サブツリーがない場合、左サブツリーのルートノードを使用して削除されたノードを置き換えます(node.rightchild!= null){node = node.leftchild; } else if(node.leftchild == null){//削除されたノードに左のサブツリーがない場合、削除されたノードnode = node.rightchildの代わりに、単語数の左端ノードを使用します。 } else {//削除されたノードの左と右のサブツリーがtemp = node.leftchild; while(temp.rightchild!= null){temp = temp.rightchild; //左サブツリーの右ノードを見つける} temp = node; node = node.leftchild; } temp = null; }} / * *コピーと削除 * / public void deleteByCoping(searchBinaryTreenode <T> node){searchBinaryTreenode <T> pre = null; searchbinarytreenode <t> temp = node; //削除されたノードに右サブツリーがない場合は、左サブツリーのルートノードを使用して削除されたノードを置き換えます(node.rightchild == null){node = node.leftchild; } else if(node.leftchild == null){node = node.rightchild; } else {//削除されたノードの左と右のサブツリーがtemp = node.leftchild; pre = node; while(temp.rightchild!= null){pre = temp; temp = temp.rightchild; //左サブツリーの右端ノードを見つけるために移動} node.data = temp.data; //割り当て操作を実行する場合(pre == node){pre.leftchild = node.leftchild; } else {pre.rightchild = node.rightchild; }} temp = null; }}テストクラス
パッケージSearchBinaryTree; public class searchBinaryTreetest {public static void main(string [] args){searchbinarytree <integer> tree = new searchbinarytree <integer>(); for(int i = 1; i <10; i ++){tree.createTree(new searchbinarytreenode <integer>()、i); } // tree.search(tree.root、7); // tree.deleteBymerging(new searchbinarytreenode <integer>(8)); // tree.deleteByCopingをコピーして削除します(new searchBinaryTreenode <Integer>(6)); }}わかりました、それだけです!
上記の記事Javaはバイナリ検索ツリーを作成し、検索、挿入、および削除操作の例を実装して、すべてがあなたと共有するコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。