典型查找算法.pptVIP

  • 2
  • 0
  • 约8.8千字
  • 约 10页
  • 2019-09-06 发布于广东
  • 举报
* 由图9.4可以看出,对二叉排序树进行中序遍历,便可得到一个按关键码有序的序列,因此,一个无序序列,可通过构一棵二叉排序树而成为有序序列。 * 输入:45,24,55,12,37,53,60,28,40,70 45 24 55 12 37 60 53 28 40 70 (a) * 二.二叉排序树查找过程 从其定义可见,二叉排序树的查找过程为:  ① 若查找树为空,查找失败。  ② 查找树非空,将给定值kx与查找树的根结 点关键码比较。  ③ 若相等,查找成功,结束查找过程, 否则, a.当给定值kx小于根结点关键码,查找将在以左子女为根的子树上继续进行,转① b.当给定值kx大于根结点关键码,查找将在以右子女为根的子树上继续进行,转① * 以二叉链表作为二叉排序树的存储结构,则查找过程算法程序描述如下: typedef struct NODE { ElemType elem; /*数据元素字段*/ struct NODE *lc,*rc; /*左、右指针字段*/ }NodeType; /*二叉树结点类型*/ * 【算法9.4】 int SearchElem(NodeType *t,NodeType **p,NodeType **q,KeyType kx) { /*在二叉排序树t上查找关键码为kx的元素,若找到,返回1,且q指向该结点,p指向其父结点;否则,返回0,且p指向查找失败的最后一个结点*/ int flag=0; *q=t; while(*q) /*从根结点开始查找*/ { if(kx(*q)-elem.key) /*kx大于当前结点*q的元素关键码*/ {*p=*q;*q=(*q)-rc; } /*将当前结点*q的右子女置为新根*/ else {if(kx(*q)-elem.key) /*kx小于当前结点*q的元素关键码*/ {*p=*q;*q=(*q)-lc;} /*将当前结点*q的左子女置为新根*/ else {flag=1;break;} /*查找成功,返回*/ } } /*while*/ return flag; } * 时间复杂度: 分析:在二叉排序树上进行查找的过程中,根结点为待查结点时,给定值同树中结点的比较次数仅为一次,待查结点位于最后一层时,比较的次数为树的深度。 普通情况下,对二叉排序树进行查找的时间复杂度为O( ); 最差情况下(二叉排序树为一棵单支树),其时间复杂度为O(n)。 为使得由任何初始序列构成的二叉排序树的平均查找长度是 对数级的,所以我们可使得构造的二叉排序树是一个平衡二叉树。 * 三.二叉排序树插入操作和构造一棵二叉排序树 向二叉排序树中插入一个结点的过程:设待插入结点的关键码为kx,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,待插入结点已存在,不用插入;查找不成功时,则插入之。因此,新插入结点一定是作为叶子结点添加上去的。 构造一棵二叉排序树则是逐个插入结点的过程。 * 图9.5 从空树开始建立二叉排序树的过程 * 【算法9.5】 int InsertNode (NodeType **t,KeyType kx) { /*在二叉排序树*t上插入关键码为kx的结点*/ NodeType *q, *s , *p=*t; int flag=0; if(!SearchElem(*t,p,q,kx)); /*在*t为根的子树上查找*/ { s=(NodeType *)malloc(sizeof(NodeType));/*申请结点,并赋值*/ s-elem.key=kx;s-lc=NULL;s-rc=NULL; flag=1; /*设置插入成功标志*/ if(!p) t=s; /*向空树中插入时*/ else {if(kxp-elem.key) p-rc=s; /*插入结点为p的右子女*/ else p-lc=s; /*插入结点为p的左子女*/ } } return flag; } *

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档