一.插入和查找
1.二叉查找树(Binary Search Tree)是一棵二叉树,并且每个结点都含有一个Comparable的键,保证每个结点的键都大于其左子树中任意结点的键而小于其右子树的任意结点的键。
2.一个结点需要维持几个实数域,即键,值,左、右结点,还需要维持一个count值,用来表示该结点含有的子树的结点数(包括自己)
3.查找的实现:如果小于该节点,去该节点的左边找;如果大于该节点,去该节点的右边找,如果相等,则找到了该值。
插入的实现:key在BST中,重置value;key不在BST中,添加新的结点。
package com.cx.serch; import java.util.LinkedList; import java.util.Queue; public class BST<Key extends Comparable<Key>,Value> { private Node root; /** * 定义Node节点,用来存储键值对,以及左右的节点 */ private class Node{ private Key key; private Value value; private Node left,right; //添加一个count属性,这个属性用来记录以该节点为根的节点数(包括自己) private int count; public Node(Key key,Value value,int count) { this.key=key; this.value=value; this.count=count; } } /** * 实现size()方法 */ public int size() { return size(root); } private int size(Node x) { if(x==null) return 0; return x.count; } /** * 实现插入键值对的方法 */ public void put(Key key,Value value) { //如果根节点是null,给它赋上key,value //如果有根节点,根的合适位置添上该节点 root=put(root, key, value); } public Node put(Node x,Key key,Value value) { if(x==null) return new Node(key, value , 1); int cmp=key.compareTo(x.key); if(cmp<0) x.left=put(x.left, key, value); else if(cmp>0) x.right=put(x.right, key, value); else x.value=value; x.count=size(x.left)+size(x.right)+1; return x; } /** * 实现查找某个key的方法 */ //比Node大,去右边找,比Node小去左边找 public Value get(Key key) { Node x=root; while(x!=null) { int cmp = key.compareTo(x.key); if (cmp<0) x=x.left; else if(cmp>0) x=x.right; else return x.value; } return null; } }