バイナリツリー部分関数実装 (JAVA)
リリース: 2016-07-25 09:02:30
主にバイナリツリーの一般的な使い方を実装しています。いくつかの間違いがあるかもしれません。
- package Structure.tree;
-
- public class Node {
-
- public int idata;
- public double ddata;
- public Node leftNode;
- public Node rightNode;
-
- public Node() {
-
- }
-
- public void display() {// отй╬╫з╣Ц
- System.out.print('{');
- System.out.print(idata);
- System.out.print(',');
- System.out .print(ddata);
- System.out.print('}');
- }
- }
-
コードをコピー
[コード]パッケージ構造.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(" |
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31