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 }