<table cellspacing="0" cellpadding="0"><tr><td class="t_f" id="postmessage_34501"> 主にバイナリツリーの一般的な使い方を実装しています。いくつかの間違いがあるかもしれません。 <div class="blockcode"> <div id="code_QuO"><ol> <li>package Structure.tree;</li> <li> <li>public class Node {</li> <li> <li> public int idata;</li> <li> public double ddata;</li> <li> public Node leftNode;</li> <li> public Node rightNode;</li> <li> </li> <li> public Node() {</li> <li> </li> <li> }</li> <li> </li> <li> public void display() {// отй╬╫з╣Ц </li> <li> System.out.print('{');</li> <li> System.out.print(idata);</li> <li> System.out.print(',');</li> <li> System.out .print(ddata);</li> <li> System.out.print('}');</li> <li> }</li> <li>}</li> <li> </ol></div> <em onclick="copycode($('code_QuO'));">コードをコピー</em> </div>[コード]パッケージ構造.tree; java.util.Stackをインポートします。 パブリック クラス ツリー { /* ノード属性。ツリーはノードで構成されます */ プライベートノードのルート。 パブリックツリー() { ルート = null; } /*** 指定されたキー値を持つツリー ノードを検索します * * @paramキー * @戻る*/ パブリックノード find(int key) { 現在のノード = ルート; while(current.idata != キー) { if(キー キー) { isLeftNode = true; 現在 = 現在の.leftNode; } else if(current.idata キー) { isLeftNode = true; 現在 = 現在の.leftNode; } それ以外 { isLeftNode = false; 現在 = current.rightNode; } if(current == null) {//対応する指定されたノードが見つかりませんでした フラグ = false; リターンフラグ; } }//while ループを終了します // この時点までの実行は、削除する現在のノードを見つけることを意味します //削除されたノードはリーフノードです if(current.leftNode == null && current.rightNode == null) { if(isLeftNode == true) 親.leftNode = null; それ以外 親.rightNode = null; } //削除されたノードには左側の子ノードのみが含まれます else if(current.rightNode == null) { if(現在 == ルート) ルート = current.leftNode; else if(isLeftNode) 親.leftNode = 現在の.leftNode; それ以外 親.rightNode = 現在.leftNode; } //削除されたノードには正しい子ノードのみが含まれます else if(current.leftNode == null) { if(現在の == ルート) ルート = current.rightNode; else if(isLeftNode) 親.leftNode = current.rightNode; それ以外 親.rightNode = current.rightNode; } //削除されたノードには左の子ノードと右の子ノードがあります それ以外 { ノード交換ノード = getReplacedNode(現在); if(現在 == ルート) ルート = 置き換えられたノード; else if(isLeftNode) parent.leftNode = replaceNode; それ以外 parent.rightNode = replaceNode; } リターンフラグ; } /*** 選択範囲の走査方法を決定する * * @param traverseType*/ パブリック void traverse(int traverseType) { スイッチ(トラバースタイプ) { ケース1: System.out.print("n 事前注文トラバーサル:"); preOrder(ルート); 壊す; ケース 2: System.out.print("n の順序トラバーサル:"); inOrder(ルート); 壊す; ケース 3: System.out.print("n 事後走査:"); postOrder(ルート); 壊す; } System.out.println(); } /*** 順番に並べ替えます*/ private void preOrder(Node ノード) { if(ノード!= null) { System.out.print(node.idata + " "); preOrder(node.leftNode); preOrder(node.rightNode); } } /**※中順に並べています*/ private void inOrder(Node ノード) { if(ノード!= null) { preOrder(node.leftNode); System.out.print(node.idata + " "); preOrder(node.rightNode); } } /**※降順に並べています*/ private void postOrder(Node ノード) { if(ノード!= null) { preOrder(node.leftNode); preOrder(node.rightNode); System.out.print(node.idata + " "); } } /*** [削除されたノード] を置換するノードを検索し、[置換ポイント] をルートとするサブツリーを構築します * 説明: [削除されたノード] の右側のサブツリーで最小のキー値を持つ点を [置換ノード] として検索します。これは明らかに右側のサブツリー (存在する場合) の左側の葉ノードです。 * * @param delNode * @戻る*/ プライベート ノード getReplacedNode(Node delNode) { 現在のノード = delNode.rightNode; ノードが置き換えられましたNode = delNode; ノードが置き換えられましたParentNode = delNode; while(current != null) { replaceParentNode = replaceNode; 置き換えられたノード = 現在; 現在 = 現在の.leftNode; }if(replacedNode != delNode.rightNode) { // replaceNode就是要代替掉【被删除节点】的节点 replaceParentNode.leftNode = replaceNode.rightNode; replaceNode.rightNode = delNode.rightNode; } replaceNode.leftNode = delNode.leftNode; 置き換えられたノードを返します。 } /*** ツリー構造を表示 * * @paramノード*/ @SuppressWarnings("未チェック") public void displayTree() { System.out.println("</td></tr></table> <div id="comment_34501" class="cm"> </div> <div id="post_rate_div_34501"></div> <br><br>