順序二叉樹實現


  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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM