線分データの数え上げ
今、N個のデータが得られるとする。そのデータは、1次元尺度上の線分に相当するデータであるものとする。簡単に言えば、aiからbiまでというようなデータが、N個得られるとする。このようなデータから、ある値xについて、[tex:ai<=x
package binaryTree; /** * 2分探索木 * * @version $Revision: 1.6 $, $Date: 2003/04/28 23:23:14 $ */ import java.io.*; public class BinarySearchTreeRY { class Node { Node left, right; double value; Node(Node left, Node right, double value) { this.left = left; this.right = right; this.value=value; } } final private Node zero = new Node(null, null, -99), // 各葉の子(番人用) rootParent = new Node(null, zero, 0); // {\tt rootParent.right} が根 private Node parent; private boolean isChildLeft; // 検索成功時の親 public boolean isEmpty() { return (rootParent.right == zero); } public Node searchNode(double value) { // 検索(未登録なら {\tt null} を返す) zero.value=-99; // {\tt zero} は番人 Node child = rootParent; //int cmp = 1; // 最初の子は {\tt rootParent.right} double cmp = 1; boolean loop=true; do { parent = child; if (cmp < 0) { child = child.left; isChildLeft = true; } else { child = child.right; isChildLeft = false; } //System.out.println("value="+value); //System.out.println("child.value="+child.value); if(child.value==-99){ loop=false; }else{ cmp=-value+child.value; if(cmp==0){ loop=false; } } //} while ((cmp = key.compareTo(child.key)) != 0); } while (loop); //System.out.println("childvalue="+child.value); return (child == zero) ? null : child; } public Node insertNode(double value) { // 挿入(登録) if (searchNode(value) != null) return null; // すでに登録されている Node newChild = new Node(zero, zero, value); if (isChildLeft) parent.left = newChild; else parent.right = newChild; return newChild; } public boolean deleteNode(double value) { // 削除できれば {\tt true} を返す final Node target = searchNode(value); if (target == null) return false; // 未登録 Node newChild; // {\tt target} の代わりに {\tt parent} の子になる if (target.left == zero) newChild = target.right; else if (target.right == zero) newChild = target.left; else { Node s = target.left; // {\tt s} を {\tt target} の次に小さいものに if (s.right != zero) { Node p; // {\tt s} の親 do { p = s; s = s.right; } while (s.right != zero); p.right = s.left; s.left = target.left; } s.right = target.right; newChild = s; } if (isChildLeft) parent.left = newChild; else parent.right = newChild; return true; // 削除成功, C++ では {\tt delete target;} も必要 } public void printNode() { if (!isEmpty()) printNode(rootParent.right); } private int depth = 0; private void printNode(Node p) { // 深さ優先探索,中間順でキーを表示 if (p.left != zero) { depth++; printNode(p.left); depth--; } for (int i = 0; i < depth; i++) System.out.print(" "); System.out.println(p.value); if (p.right != zero) { depth++; printNode(p.right); depth--; } } public static void main(String[] args) throws IOException { int n=10; double[] data=new double[n]; for(int i=0;i<data.length;i++){ data[i]=Math.random(); } BinarySearchTreeRY tree = new BinarySearchTreeRY(); /* System.out.print("命令 Iabc: abcを挿入\n" + " Dabc: abcを削除\n" + " Sabc: abcを検索\n"); */ String message; for (int i=0;i<data.length;i++) { double value=data[i]; if (tree.insertNode(value) != null) message = "登録しました."; else message = "登録ずみです."; //break; System.out.println(message); tree.printNode(); } int[] searchID={5,3,8}; for(int i=0;i<searchID.length;i++){ if (tree.searchNode(data[searchID[i]]) != null) message = "登録されています."; else message = "登録されていません"; System.out.println(message); } double valueex=2; if (tree.searchNode(valueex) != null) message = "登録されています."; else message = "登録されていません"; System.out.println(message); int[] deleteID={6,3,9}; for(int i=0;i<deleteID.length;i++){ if (tree.deleteNode(data[deleteID[i]])) message = "削除しました."; else message = "登録されていません."; System.out.println(message); } tree.printNode(); /* for (int i=0;i<data.length;i++) { String message; double value=data[i]; String insert="'I'"; switch ('I') { case 'I': if (tree.insertNode(value) != null) message = "登録しました."; else message = "登録ずみです."; break; case 'D': if (tree.deleteNode(value)) message = "削除しました."; else message = "登録されていません."; break; case 'S': if (tree.searchNode(value) != null) message = "登録されています."; else message = "登録されていません"; break; default: message = "使えるのは I, D, S です."; break; } System.out.println(message); tree.printNode(); } */ } }