1 #include"stdio.h" 2 #include"stdlib.h" 3 #include"iostream" 4 5 typedef struct bstnode{ 6 int data; 7 struct bstnode *lchild; 8 struct bstnode *rchild; 9 }bstnode, *BSTree; //结构体类型,BSTree为结构体指针 10 11 //函数声明区 12 BSTree create_BSTree(int *arr, int len); 13 BSTree search(BSTree pTree, int key); 14 void in_traverse(BSTree pTree); 15 bool search_BSTree(BSTree pTree, int key, BSTree parent, BSTree &p); 16 bool insert(BSTree &pTree, int key); 17 18 //根据所给的长为len的arr数组,按数组中元素的顺序构建一棵二叉排序树 19 BSTree create_BSTree(int *arr, int len) { 20 BSTree pTree = NULL; //初始化树为空树 21 int i; 22 for (i = 0; i<len; i++) 23 insert(pTree, arr[i]); // 24 return pTree; //将数组中的数插入后返回 25 } 26 27 void in_traverse(BSTree pTree) { 28 if (pTree){ //如果树不为空则中序递归的打印出树中的元素 29 if (pTree->lchild) 30 in_traverse(pTree->lchild); 31 printf("%d ", pTree->data); 32 if (pTree->rchild) 33 in_traverse(pTree->rchild); 34 } 35 } 36 37 BSTree search(BSTree pTree, int key){ 38 if (!pTree || pTree->data == key) //如果树不为空, 39 return pTree; 40 else if (key < pTree->data) //如果key的值小于data,则往左搜索,否则往右,递归的进行 41 return search(pTree->lchild, key); 42 else 43 return search(pTree->rchild, key); 44 } 45 46 bool search_BSTree(BSTree pTree, int key, BSTree parent, BSTree &p){ //用于查找到inset函数要用到的待插入元素位置的指针 47 if (!pTree){ //如果树中没有元素,直接返回根节点 48 p = parent; 49 return false; 50 } 51 else { 52 if (key == pTree->data){ 53 p = pTree; //p保存访问的最后一个结点指针 54 return true; 55 } 56 else if (key < pTree->data) 57 return search_BSTree(pTree->lchild, key, pTree, p); 58 else 59 return search_BSTree(pTree->rchild, key, pTree, p); 60 } 61 } 62 63 bool insert(BSTree &pTree, int key){ 64 BSTree p; 65 if (!search_BSTree(pTree, key, NULL, p)){ 66 BSTree pNew = (BSTree)malloc(sizeof(bstnode)); 67 pNew->data = key; 68 pNew->lchild = pNew->rchild = NULL; //分配一个新节点 69 if (!p) 70 pTree = pNew; 71 else if (key < p->data) 72 p->lchild = pNew; 73 else 74 p->rchild = pNew; 75 } 76 else 77 return false; 78 } 79 void delete_bstnode1(BSTree &p){ 80 BSTree q, s; 81 if (!p->lchild){ 82 q = p; 83 p = p->rchild; 84 free(q); 85 } 86 else if (!p->rchild){ 87 q = p; 88 p = p->lchild; 89 free(q); 90 } 91 else{ 92 s = p->lchild; 93 while (s->rchild) 94 s = s->rchild; 95 s->rchild = p->rchild; 96 q = p; 97 p = p->lchild; 98 free(q); 99 } 100 } 101 102 bool delete_BSTree(BSTree &pTree, int key){ 103 if (!pTree) 104 return false; 105 else{ 106 if (key == pTree->data){ 107 delete_bstnode1(pTree); 108 return true; 109 } 110 else if (key < pTree->data) 111 return delete_BSTree(pTree->lchild, key); 112 else 113 return delete_BSTree(pTree->rchild, key); 114 } 115 } 116 117 void main(){ 118 int i; 119 int num; 120 printf("请输入节点个数:"); 121 scanf_s("%d", &num); 122 int *arr = (int *)malloc(num * sizeof(int)); 123 printf("请依次输入这%d个整数(必须互不相等):", num); 124 for (i = 0; i<num; i++) 125 scanf_s("%d", arr + i); 126 BSTree pTree = create_BSTree(arr, num); 127 printf("中序遍历该二叉排序树的结果:"); 128 in_traverse(pTree); 129 printf("\n"); 130 int key; 131 printf("请输入要查找的整数:"); 132 scanf_s("%d", &key); 133 if (search(pTree, key)) 134 printf("查找成功,%d存在\n",key); 135 else 136 printf("查找不到该整数\n"); 137 printf("请输入要插入的整数:"); 138 scanf_s("%d", &key); 139 if (insert(pTree, key)){ 140 printf("插入成功,插入后的中序遍历结果:"); 141 in_traverse(pTree); 142 printf("\n"); 143 } 144 else 145 printf("插入失败,该二叉排序树中已经存在整数%d\n", key); 146 printf("请输入要删除的整数:"); 147 scanf_s("%d", &key); 148 if (delete_BSTree(pTree, key)){ 149 printf("删除成功,插入后的中序遍历结果:"); 150 in_traverse(pTree); 151 printf("\n"); 152 } 153 else 154 printf("删除失败,该二叉排序树中不存在整数%d\n", key); 155 system("pause"); 156 }