該博客經過代碼來展現對二叉排序樹的各類操做:node
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef int KeyType; 5 6 typedef struct Node 7 { 8 KeyType key;//關鍵字 9 struct Node *left;//左孩子指針 10 struct Node *right;//右孩子指針 11 struct Node *parent;//指向父親節點的指針 12 }Node,*PNode; 13 14 /* 15 *往二叉排序樹中插入節點 16 *插入的話,可能要改變根節點的地址,因此傳的是二級指針 17 */ 18 19 void insert(PNode *root,KeyType key) 20 { 21 //初始化插入節點 22 PNode p=(PNode)malloc(sizeof(Node)); 23 p->key=key; 24 p->left=p->right=p->parent=NULL; 25 //空樹時,直接做爲根節點 26 if((*root)==NULL) 27 { 28 *root=p; 29 return ; 30 } 31 //插入到當前節點的左孩子 32 if((*root)->left==NULL&&(*root)->key>key) 33 { 34 p->parent=(*root); 35 (*root)->left=p; 36 return ; 37 } 38 //插入到當前節點的右孩子 39 if((*root)->right==NULL&&(*root)->key<key) 40 { 41 p->parent=(*root); 42 (*root)->right=p; 43 return ; 44 } 45 if((*root)->key>key) 46 { 47 insert(&(*root)->left,key); 48 } 49 else if((*root)->key<key) 50 insert(&(*root)->right,key); 51 else return; 52 } 53 54 //查找元素,找到返回關鍵字的結點指針,沒有找到返回NULL 55 56 PNode search(PNode root,KeyType key) 57 { 58 if(root==NULL) 59 return NULL; 60 if(key>root->key)//查找右子樹 61 return search(root->right,key); 62 else if(key<root->key)//查找左子樹 63 return search(root->left,key); 64 else 65 return root; 66 //查找最小關鍵字。空樹時返回NULL 67 PNode searchMin(PNode root) 68 { 69 if(root==NULL) 70 return NULL; 71 if(root->left==NULL) 72 return root; 73 else //一直往左孩子找 74 return searchMin(root->left); 75 } 76 77 //查找最大關鍵字,空樹時返回NULL 78 PNode searchMax(PNode root) 79 { 80 if(root==NULL) 81 return NULL; 82 if(root->right==NULL) 83 return root; 84 else //一直往右孩子找 85 return searchMax(root->right); 86 } 87 /* 88 *根據關鍵字刪除某個結點,刪除成功返回1,不然返回0; 89 *若是把結點刪掉,那麼要改變根節點的地址,因此傳二級指針 90 */ 91 int deleteNode(PNode *root,KeyType key) 92 { 93 PNode q; 94 //查找要刪除的結點 95 PNode p=search(*root,key); 96 KeyType temp;//暫存後繼結點的值 97 if(!p) 98 return 0; 99 //1.被刪的結點是葉子結點,直接刪除 100 if(p->left==NULL&&p->right==NULL) 101 { 102 //只有一個元素,刪完後變成空樹 103 if(p->parent==NULL) 104 { 105 free(p); 106 (*root)=NULL: 107 } 108 else{ 109 if(p->parent->left==p) 110 p->parent->left=NULL; 111 else 112 p->parent->right=NULL; 113 free(p); 114 } 115 } 116 //2.被刪除的結點只有左子樹 117 else if(p->left&&!(p->right)) 118 { 119 p->left->parent=p->parent; 120 if(p->parent==NULL) 121 *root=p->left; 122 else if(p->parent->left==p) 123 p->parent->left=p->left; 124 else 125 p->parent->right=p->left; 126 free(p); 127 } 128 //3.被刪除的結點只有右孩子 129 else if(p->right&&!(p->left)) 130 { 131 p->right->parent=p->parent; 132 //若是刪除是父結點,要改變父節點指針 133 if(p->parent == NULL) 134 *root=p->right; 135 //刪除的結點是父節點的左孩子 136 else if(p->parent->left == p) 137 p->parent->left=p->right; 138 else //刪除的結點是父節點的右孩子 139 p->parent->right=p->right; 140 free(p); 141 } 142 //4.被刪除的結點既有左孩子,又有右孩子 143 //該結點的後繼結點確定無左子樹(參考上面查找後繼結點函數) 144 //刪掉後繼結點,後繼結點的值代替該結點 145 else{ 146 //找到要刪除結點的後繼 147 q=searchSuccessor(p); 148 temp=q->key; 149 //刪除後繼結點 150 deleteNode(root,q->key); 151 p->key=temp; 152 } 153 return 1; 154 } 155 156 //建立一棵二叉排序樹 157 void create(PNode *root,KeyType *keyArray,int length) 158 { 159 int i; 160 for(i=0;i<length;i++) 161 insert(root,keyArray[i]); 162 } 163 164 int main(void) 165 { 166 int i; 167 PNode root=NULL; 168 KeyType nodeArray[11]={15,6,18,3,7,17,20,2,4,13,9}; 169 create(&root,nodeArray,11); 170 for(i=0;i<2;i++) 171 deleteNode(&root,nodeArray[i]); 172 printf("%d\n",searchMin(root)->key); 173 printf("%d\n",searchMax(root)->key); 174 printf("%d\n",search(root,13)->key); 175 return 0; 176 } 177 }