查找——二叉排序树
来源:互联网 发布:linux运维最佳实践 pdf 编辑:程序博客网 时间:2024/06/06 01:32
用线性表作为表的组织形式时,用二分查找效率最高。但二分查找只能用于顺序存储结构,不能用链式存储结构,不适用于插入删除操作频繁的情况,只适合静态查找表。
对动态查找表进行高效率查找,最好用二叉排序树。
1.基本概念
二叉排序树(Binary Sort Tree):为空或满足以下条件:
(1)每个结点左子树上所有结点的关键字,值都小于该结点的关键字;
(2)每个结点右子树上所有结点的关键字,值都大于该结点的关键字;
(3 )左右子树本身也是二叉排序树。
2.特点
(1)对任一节点x,左(右)子树任一结点y的关键字必小于(大于)x的关键字;
(2)各结点关键字是唯一的,(但实际应用不能保证元素都不相同,此时可以将左子树关键字改为小于等于,或者右子树关键字大于等于)
(3)按中序遍历该树得到的是递增有序序列。
3.二叉排序树的插入和生成
初始二叉树为空,然后读入元素,插入树中。已知关键字为key的结点s,将其插入到二叉排序树中:
(1)二叉树为空,key为二叉树的根;
(2)非空,如果key小于根结点的值,则插入左子树,如果key大于根结点的值,则插入右子树,等于的话停止插入。
Node类:
//二叉树结点类public class Node {private Integer data;private Node left;private Node right;public Node() {}public Node(int data) {this.data=data;}public Integer getData() {return this.data;}public void setData() {this.data=data;}//得到左子树public Node getLeft() {return this.left;}public Node getRight() {return this.right;}public void setLeft(Node left) {this.left=left;}public void setRight(Node right) {this.right=right;}}创建和插入结点实现:
public Node createBST(Node root,int []datas) {root=null;int index=0;while(index<datas.length){root=insertBST(root,datas[index]);index++;}return root;}//插入元素,非递归public Node insertBST(Node root,int data) {Node insertNode=new Node(data);while(root!=null) {if(root.getData()==data) {System.out.println("该元素已存在");return root;}else if(data<root.getData()) {if(root.getLeft()!=null) {root=root.getLeft();}else {root.setLeft(insertNode);return root;}}else if(data>root.getData()) {if(root.getRight()!=null) {root=root.getRight();}else {root.setRight(insertNode);return root;}} }root=insertNode;return root;}//插入元素 递归public Node rInsertBST(Node root,int data) {Node insertNode=new Node(data);if(root==null) {root=insertNode;}else if(data<root.getData()) {root=root.getLeft();root=rInsertBST(root,data);}else if(data>root.getData()) {root=root.getRight();root=rInsertBST(root,data);}return root;}
4.查找
查找的元素key与当前结点的值data比较,如果key<data则到当前结点的左子树搜索;如果key>data则到当前结点的右子树搜索;
key==data则找到该元素;
一直搜索到空,则不存在要找的元素。
public boolean search(Node root,int data) {while(root!=null) {if(root.getData()==data)return true;else if(data<root.getData())root=root.getLeft();else if(data>root.getData())root=root.getRight();}return false;
5.算法分析
(1)二叉排序树等概率下,查找成功时平均查找长度为
(2)二叉排序树查找的平均查找长度与二叉树的形态有关
n个结点的二叉排序树不唯一,结点插入顺序不同,树的形态和深度也不同
a.最坏情况下,是深度为n 的单支树,平均查找长度和顺序表一样是(n+1)/2
b.最好情况下,树的形态比较均匀,得到的是与二分查找的判定树相似的二叉排序树,平均查找长度为lgn
c.插入、删除的时间复杂度均为O(lgn)
阅读全文
0 0
- 查找——二叉排序树
- 动态查找—二叉排序树
- 动态查找——二叉排序树
- 数据结构——查找之二叉排序树
- 查找算法复习——二叉排序树
- 第十四周项目6—二叉排序树中查找的路径
- 第十四周项目6—二叉排序树中查找的路径
- 二叉排序树查找
- 二叉排序树查找
- 查找、二叉排序树
- 二叉排序树查找
- 查找-二叉排序树
- 查找(3)——二叉排序树的建立、结点的查找和删除
- 二叉排序树查找-动态查找
- 二分查找、二叉排序树查找
- 二叉排序树——SDUT
- 2482——二叉排序树
- 大话数据结构—二叉排序树
- MySQL • 引擎特性 • DROP TABLE之binlog解析
- MySQL优化--数据结构的优化
- MySQL · 数据恢复 · undrop-for-innodb
- 【惊雷】Linux下多网卡冗余的实现
- 关于csdn的排名
- 查找——二叉排序树
- bzoj1042: [HAOI2008]硬币购物
- TCP状态和常见攻击方式
- MySQL优化--服务器优化
- TCP 的那些事儿(下)
- IAR-AVR-C编译器的使用B
- ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流
- 硬件产品如何防止抄板
- error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string