查找-二叉排序树查找

男娘i 2022-05-12 03:18 333阅读 0赞

二叉排序树的性质:

(1)若某节点的左子树非空,则左子树上所有元素的值都小于该元素的值。

(2)若某节点的右子树非空,则右子树上所有元素的值都大于该元素的值。

问题:在二叉排序树种,原则上各元素关键字是唯一的。然而在实际运用中,不能保证各元素之间的关键字都不相同。因此性质中,可以把”大于“或”小于“修改成”大于等于“或者“小于等于”。

特点:

1.二叉排序树是有序的

2.构造的二叉排序树高度越小,其查找的效率越高。

时间复杂度:

O(nlog2(n))

优点:无须移动元素,只修改指针就实现插入和删除操作。

70

代码:

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. int path[100];
  4. //数据表
  5. typedef struct node
  6. {
  7. int key;
  8. struct node *lchild,*rchild;
  9. }BSTNode;
  10. //插入数据
  11. int InsertBST(BSTNode *&p,int k)
  12. {
  13. if(p==NULL)
  14. {
  15. p=(BSTNode*)malloc(sizeof(BSTNode));
  16. p->key=k;
  17. p->lchild=NULL;
  18. p->rchild=NULL;
  19. return 1;
  20. }
  21. else if(k==p->key)
  22. {
  23. return 0;
  24. }
  25. else if(k<p->key)
  26. {
  27. return InsertBST(p->rchild,k);
  28. }
  29. else
  30. {
  31. return InsertBST(p->rchild,k);
  32. }
  33. }
  34. //创建二叉树
  35. BSTNode *CreateBST(int arr[],int n)
  36. {
  37. BSTNode *bt=NULL;
  38. int i=0;
  39. while(i<n)
  40. if(InsertBST(bt,arr[i])==1)
  41. {
  42. i++;
  43. }
  44. return bt;
  45. }
  46. //非递归查找
  47. void SearchBST_NoRec(BSTNode *bt,int k,int path[],int i)
  48. {
  49. int j;
  50. if(bt==NULL)
  51. {
  52. return;
  53. }
  54. else if(k==bt->key)
  55. {
  56. path[i]=bt->key;
  57. for(j=0;j<=i;j++)
  58. printf("%3d",path[j]);
  59. printf("\n");
  60. }
  61. else
  62. {
  63. path[i]=bt->key;
  64. if(k<bt->key)
  65. SearchBST_NoRec(bt->lchild,k,path,i+1);
  66. else
  67. SearchBST_NoRec(bt->rchild,k,path,i+1);
  68. }
  69. }
  70. //递归查找
  71. int SearchBST_Rec(BSTNode *bt,int k)
  72. {
  73. if(bt==NULL)
  74. return 0;
  75. else if(k==bt->key)
  76. {
  77. printf("%3d",bt->key);
  78. return 1;
  79. }
  80. else if(k<bt->key)
  81. SearchBST_Rec(bt->lchild,k);
  82. else
  83. SearchBST_Rec(bt->rchild,k);
  84. printf("%3d",bt->key);
  85. }
  86. void main()
  87. {
  88. BSTNode *bt;
  89. int k=6;
  90. int arr[]={4,9,0,1,8,6,3,5,2,7},n=10;
  91. bt=CreateBST(arr,n);
  92. printf("查找%d关键字(非递归):",k);
  93. SearchBST_NoRec(bt,k,path,0);
  94. printf("查找%d关键字(递归):",k);
  95. SearchBST_Rec(bt,k);
  96. }

发表评论

表情:
评论列表 (有 0 条评论,333人围观)

还没有评论,来说两句吧...

相关阅读

    相关 查找排序

    先介绍下基本概念:二叉排序树是一棵二叉树,或者为空,或者满足以下条件: ①若左子树不空,则其上的值均小于根的值; ②若右子树不空,其上的值均不小于根的值; ③左右子...

    相关 查找(排序)

    构造一棵二叉排序树并对其进行中序遍历输出。 在二叉排序树中查找某一关键字,若存在,显示“查找成功”以及查找成功时关键字比较次数;若不存在,将其插入到二叉排序树中,再中序遍历输出

    相关 查找

    本文将会介绍一种能够将链表插入的灵活性和有序数组查找的高效性结合在一起的符号表实现。 定义 一颗二叉查找树(BST)是一颗二叉树,其中每个结点都含有一个Comparab

    相关 查找-排序查找

    二叉排序树的性质: (1)若某节点的左子树非空,则左子树上所有元素的值都小于该元素的值。 (2)若某节点的右子树非空,则右子树上所有元素的值都大于该元素的值。 问题:在二

    相关 查找

    / 这是一个二叉查找树,实现了以下操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继。上述所有操作时

    相关 查找

    理解 在二叉树的基础上,假设一个节点值都为Integer类型,现在有一个节点A,那么A的左子树中的所有值一定小于A节点的值,A的右子树中的所有值一定大于A的节点的值,如果