查找 - 树上的查找 - 二叉排序树(五)

作者&投稿:应伏 (若有异议请与网页底部的电邮联系)
~

   )在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关

  二分查找法查找长度为n的有序表 其判定树是惟一的 含有n个结点的二叉排序树却不惟一 对于含有同样一组结点的表 由于

  结点插入的先后次序不同 所构成的二叉排序树的形态和深度也可能不同

  【例】下图(a)所示的树 是按如下插入次序构成的

  

  下图(b)所示的树 是按如下插入次序构成的

  

  

  在二叉排序树上进行查找时的平均查找长度和二叉树的形态有关

  ①在最坏情况下 二叉排序树是通过把一个有序表的n个结点依次插入而生成的 此时所得的二叉排序树蜕化为棵深度为n的单支

  树 它的平均查找长度和单链表上的顺序查找相同 亦是(n+ )/

  ②在最好情况下 二叉排序树在生成的过程中 树的形态比较匀称 最终得到的是一棵形态与二分查找的判定树相似的二叉排序

  树 此时它的平均查找长度大约是lgn

  ③插入 删除和查找算法的时间复杂度均为O(lgn)

  ( )二叉排序树和二分查找的比较

  就平均时间性能而言 二叉排序树上的查找和二分查找差不多

  就维护表的有序性而言 二叉排序树无须移动结点 只需修改指针即可完成插入和删除操作 且其平均的执行时间均为O(lgn)

  因此更有效 二分查找所涉及的有序表是一个向量 若有插入和删除结点的操作 则维护表的有序性所花的代价是O(n) 当有序表是

  静态查找表时 宜用向量作为其存储结构 而采用二分查找实现其查找操作;若有序表里动态查找表 则应选择二叉排序树作为其存

  储结构

  ( )平衡二叉树

  为了保证二叉排序树的高度为lgn 从而保证然二叉排序树上实现的插入 删除和查找等基本操作的平均时间为O(lgn) 在往树

  中插入或删除结点时 要调整树的形态来保持树的 平衡 使之既保持BST性质不变又保证树的高度在任何情况下均为O(lgn) 从而

  确保树上的基本操作在最坏情况下的时间均为O(lgn)

  注意

  ①平衡二叉树(Balanced Binary Tree)是指树中任一结点的左右子树的高度大致相同

  ②任一结点的左右子树的高度均相同(如满二叉树) 则二叉树是完全平衡的 通常 只要二叉树的高度为O( gn) 就可看作是平

  衡的

  ③平衡的二叉排序树指满足BST性质的平衡二叉树

  ④AVL树中任一结点的左 右子树的高度之差的绝对值不超过 在最坏情况下 n个结点的AVL树的高度约为 lgn 而完全平

  衡的二叉树度高约为lgn AVL树是接近最优的

lishixinzhi/Article/program/sjjg/201311/23811




南谯区13055672460: 二叉排序树的查找(C语言)代码 -
犁夜断血: #include #include #define INFMT "%d"#define OUTFMT "%d "/* #define NULL 0L */#define BOOL int#define TRUE 1#define FALSE 0#define LEN 10000 typedef int ElemType; typedef struct BSTNode { ElemType data; struct BSTNode *...

南谯区13055672460: 【数据结构】几种重要的查找算法.几种重要的查找算法.(如顺序查找、折半(二分)查找、二叉排序树上的查找) -
犁夜断血:[答案] 恩你是要问什么?顺序查找就是按顺序查找,复杂度O(n)二分查找的前提是数据是有序的 一次复杂度O(logn)例如在数组 A: 1 3 5 7 8 10 12 中如果要找 10我们先看中间的数是 7, 10比7大,那么继续在右侧二分寻找,这是一个递...

南谯区13055672460: C语言编程 二叉排序树查找 _
犁夜断血: #include<stdio.h> #include<malloc.h> #define NULL 0 typedef struct node {int data;node *left;node *right; }node;node *CreateTree(node* root,int *p,int n) {int i=n;node *q,*r;while(i!=0){if(root==NULL){root=(node *)malloc(sizeof(node *)); ...

南谯区13055672460: 二叉排序树的创建和查找 _
犁夜断血: 首先你需要做的是怎么比较电话号码关键字,只有能比较大小后才能根据关键字建立二叉排序树 然后就是二叉排序树的知识了,我在这里面放了二叉排序树的主要操作的介绍及实现,你可以看一下(二叉查找树就是二叉排序树) http://blog.csdn.net/sb55154634/archive/2010/07/22/5755201.aspx

南谯区13055672460: 二叉排序树的构造和查找方法 -
犁夜断血: 二叉排序树的构造过程:按照给定序列,以此将结点插入二叉排序树中,在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义. 插入过程:若二叉排序树为空,则待插入结点*S作为根结点插入到空树中; 当非空时,...

南谯区13055672460: 用C语言实现二叉排序树的查找、插入和删除 -
犁夜断血: #include <stdio.h>#include <conio.h> #include <stdlib.h> typedef struct BitNode { char data; struct BitNode *lchild,*rchild; }BitNode,*BiTree; void CreateBiTree(BiTree &); //生成一个二叉树 void FirstOrder(BiTree); //先序递归遍历二叉树 void ...

南谯区13055672460: 数据结构(java):二叉排序树上查找键值为K的算法函数 -
犁夜断血: 结点结构 左指针、右指针 数据域typedef struct Node{DataType data; //数据域Node *right,*left; //结点的左右子树指针 }BTNode;//函数体BTNode *FindBTree(BTNode* root, DataType item) {if(root==NULL) return NULL;if(root->data==item...

南谯区13055672460: 用C语言实现二叉排序树的查找、插入和删除 -
犁夜断血: #include<stdio.h>//二分查找法或折半查找法void main(){ int a[10]={1,3,5,9,13,16,17,26,38},count=0;//记录查找了多少次 //必须是有次的数组 int key,mid;//要查找的数字和折半后的下标 int pos=-1;//查找到的位置 int i=0,j=8; printf("请输入要查...

南谯区13055672460: 遍历查找二叉查找树 -
犁夜断血: 二叉查找树是排序的.左孩子总比父结点小,右孩子总比父结点大.用java简单写了下. public static void findkey(node root, int key, LinkedListlist) { if root == null return; if root.value == key { list.add(root); if root.left.value == key return findkey(root....

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网