二叉树
一棵二叉树是每个结点都含有一个comparable的键,且每个结点的键都大于其左子树中的任意结点而小于其右子树的左右结点的数据结构。
基本实现(二叉树结点)
可以用一个私有的类来表示二叉树上的结点。每个结点可以含有一个键,值,左链接,右链接和一个计数器。左链接指向小于该结点的所有键组成的二叉树,而右链接指向大于该结点的所有键组成的二叉树。总之一颗二叉树代表了键值的集合。
1 private class Node { 2 private Key key; 3 private Value value; 4 private Node left, right; 5 private int N; 6 7 public Node(Key key, Value value, int N) { 8 this.key = key; 9 this.value = value; 10 this.N = N; 11 }
基本实现(插入和查找)
当插入一个不存在于树种的结点并结束于一条空链接时,我们需要做的就是将链接指向一个含有被查找键的新结点。如果被查找的键小于根结点的键,我们就会继续在左字数中插入改键,否则在右子树中插入该键。使用递归实现这一例程。
1 /*********************************************************************** 2 * Insert key-value pair into BST If key already exists, update with new 3 * value 4 ***********************************************************************/ 5 public void put(Key key,Value value){ 6 if(value == null) return; 7 root = put(root, key, value); 8 } 9 10 public Node put(Node x,Key key,Value value){ 11 if(x == null) return new Node(key, value, 1); 12 int cmp = key.compareTo(x.key); 13 if(cmp < 0) x.left = put(x.left, key, value); 14 else if(cmp > 0) x.right = put(x.right, key, value); 15 else x.value = value; 16 return x; 17 }
在二叉树中随着不断向下查找,当前结点所表示的子树的大小也在减少,当找到一个含有被查找的键的结点或者是当前子树变成空的时候查找才会停止,从根结点开始,在每个结点查找进程都会递归地在它的一个子结点展开,因此一次查找也就定义了树的一条路径。对于命中的查找,路径在含有被查找的键的结点处结束,对于未命中的查找,路径的终点是一个空的链接。
1 /*********************************************************************** 2 * Search BST for given key, and return associated value if found, return 3 * null if not found 4 ***********************************************************************/ 5 public boolean contains(Key key) { 6 return get(key) != null; 7 } 8 // return value associated with the given key, or null if no such key exists 9 public Value get(Key key) { 10 return get(root, key); 11 } 12 13 private Value get(Node x, Key key) { 14 if(x == null) return null; 15 int cmp = key.compareTo(x.key); 16 if(cmp < 0) return get(x.left,key); 17 else if(cmp > 0) return get(x.right,key); 18 else return x.value; 19 }
例程的复杂度分析
使用二叉查找树算法的运行时间取决于树的形状,而树的形状有取决于插入的先后顺序。最好的情况下树是完全平衡的,此时的复杂度是lonN,而最坏的情况是搜索所经可能有N个结点,此时是查找的复杂度是线的。
- 在由N个随机键构造的二叉树中,查找命中命中所需要的平均次数是2lnN
时间: 2024-10-26 03:14:39