c++搜索二叉树的实现

  1 #pragma once
  2 #include<Windows.h>
  3 #include<stdio.h>
  4 
  5 #define SUCCESS                         1 // 执行成功                        
  6 #define ERROR             -1 // 执行失败                                 
  7 
  8 template<class T>
  9 class TreeNode {
 10 public:
 11     T element;                    //当前节点存储的数据            
 12     TreeNode<T>* pLeft;                    //指向左子节点的指针            
 13     TreeNode<T>* pRight;                    //指向右子节点的指针            
 14     TreeNode<T>* pParent;                    //指向父结点的指针            
 15 
 16 
 17     TreeNode(T& ele) {
 18         //初始化Node节点                            
 19         memset(&element, 0, sizeof(TreeNode));
 20         //为元素赋值                            
 21         memcpy(&element, &ele, sizeof(T));
 22         pLeft = pRight = pParent = NULL;
 23     }
 24     //重载== 比较两结点是否相等                                
 25     bool operator==(TreeNode<T>* node) {
 26         return node->element == element ? true : false;
 27     }
 28 };
 29 
 30 template<class T>
 31 class BSortTree {
 32 public:
 33     BSortTree();                        //构造函数        
 34     ~BSortTree();                        //析构函数        
 35 public:                            //判断树是否为空        
 36     bool IsEmpty();                        //新增节点        
 37     DWORD Insert(T element);                        //删除节点        
 38     void Delete(T element);
 39     TreeNode<T>* Search(T element);    
 40     TreeNode<T>* GetRoot();    //查找节点        
 41     void InOrderTraverse(TreeNode<T>* pNode);                        //中序遍历        
 42     void PreOrderTraverse(TreeNode<T>* pNode);                        //前序遍历        
 43     void PostOrderTraverse(TreeNode<T>* pNode);                        //后序遍历        
 44 private:
 45     TreeNode<T>* GetMaxNode(TreeNode<T>* pNode);                        //获取以pNode为根的最大节点        
 46     TreeNode<T>* GetMinNode(TreeNode<T>* pNode);                        //获取以pNode为根的最小节点        
 47     TreeNode<T>* SearchNode(TreeNode<T>* pNode, T element);                        //获取以pNode为根的最小节点        
 48     DWORD InsertNode(T element, TreeNode<T>* pNode);                        //新增节点        
 49     DWORD DeleteNode(T element, TreeNode<T>* pNode);                        //删除节点        
 50     void Clear(TreeNode<T>* pNode);                        //清空所有节点        
 51 private:
 52     TreeNode<T>* m_pRoot;                        //根结点指针        
 53     int size;                        //树中元素总个数        
 54 };
 55 
 56 template<class T>
 57 void BSortTree<T>::InOrderTraverse(TreeNode<T>* pNode)
 58 {
 59 
 60     //中序遍历所有怪物,列出怪的名字
 61     if (pNode == NULL)
 62     {
 63         return;
 64     }
 65 
 66 
 67     InOrderTraverse(pNode->pLeft);
 68     printf("%d\n", pNode->element);
 69     InOrderTraverse(pNode->pRight);
 70 
 71     return;
 72 
 73 }
 74 
 75 template<class T>
 76 TreeNode<T>* BSortTree<T>::GetRoot()
 77 {
 78     return m_pRoot;
 79 }
 80 
 81 template<class T>
 82 BSortTree<T>::BSortTree()
 83 {
 84     m_pRoot = NULL;
 85     size = 0;
 86 }
 87 template<class T>
 88 BSortTree<T>::~BSortTree() {
 89 
 90     Clear(m_pRoot);
 91 }
 92 template<class T>
 93 DWORD BSortTree<T>::Insert(T element)
 94 {
 95     //如果根节点为空                                
 96     if (!m_pRoot)
 97     {
 98         m_pRoot = new TreeNode<T>(element);
 99         size++;
100         return SUCCESS;
101     }
102     //如果根节点不为空                                
103     return InsertNode(element, m_pRoot);
104 }
105 template<class T>
106 DWORD BSortTree<T>::InsertNode(T element, TreeNode<T>* pNode)
107 {
108     //将元素封装到节点中                                
109     TreeNode<T>* pNewNode = new TreeNode<T>(element);
110     //如果element == 当前节点 直接返回                                
111     if (element == pNode->element)
112     {
113         return SUCCESS;
114     }
115     //如果pNode的左子节点为NULL 并且element < 当前节点                                
116     if (pNode->pLeft == NULL && element < pNode->element)
117     {
118         pNode->pLeft = pNewNode;
119         pNewNode->pParent = pNode;
120         size++;
121         return SUCCESS;
122     }
123     //如果pNode的右子节点为NULL 并且element > 当前节点                                
124     if (pNode->pRight == NULL && element > pNode->element) {
125         pNode->pRight = pNewNode;
126         pNewNode->pParent = pNode;
127         size++;
128         return SUCCESS;
129     }
130     //如果element<当前节点 且当前节点的左子树不为空                                
131     if (element < pNode->element)
132     {
133         InsertNode(element, pNode->pLeft);
134     }
135     else
136     {
137         InsertNode(element, pNode->pRight);
138     }
139     return SUCCESS;
140 }
141 
142 template<class T>
143 void BSortTree<T>::Clear(TreeNode<T>* pNode)
144 {
145     if (pNode != NULL)
146     {
147         Clear(pNode->pLeft);
148         Clear(pNode->pRight);
149         delete pNode;
150         pNode = NULL;
151     }
152 }
153 
154 template<class T>
155 bool BSortTree<T>::IsEmpty()
156 {
157     return size == 0 ? true : false;
158 }
159 
160 template<class T>
161 TreeNode<T>* BSortTree<T>::Search(T element)
162 {
163     return SearchNode(m_pRoot, element);
164 }
165 template<class T>
166 TreeNode<T>* BSortTree<T>::SearchNode(TreeNode<T>* pNode, T element)
167 {
168     if (pNode == NULL)                    //如果节点为NULL            
169     {
170         return NULL;
171     }
172     else if (element == pNode->element)                    //如果相等            
173     {
174         return pNode;
175     }                    //如果比节点的元素小 向左找            
176     else if (element < pNode->element)
177     {
178         return SearchNode(pNode->pLeft, element);
179     }
180     else                    //如果比节点的元素大 向右找            
181     {
182         return SearchNode(pNode->pRight, element);
183     }
184 }
185 
186 template<class T>
187 void BSortTree<T>::Delete(T element)
188 {
189     DeleteNode(element, this->m_pRoot);
190 }
191 
192 template<class T>
193 DWORD BSortTree<T>::DeleteNode(T element, TreeNode<T>* pNode)
194 {
195     //删除节点
196     
197     if (element == pNode->element)
198     {
199         printf("找到了\n");
200         if (pNode->pLeft == NULL && pNode->pRight==NULL)
201         {
202             if (pNode->element < pNode->pParent->element)
203             {
204                 pNode->pParent->pLeft = NULL;
205             }
206             else
207             {
208                 pNode->pParent->pRight = NULL;
209             }
210             delete pNode;
211             pNode = NULL;
212             return SUCCESS;
213         }
214         if (pNode->pLeft==NULL && pNode->element < pNode->pParent->element)
215         {
216             pNode->pParent->pLeft = pNode->pRight;
217             delete pNode;
218             pNode = NULL;
219             return SUCCESS;
220         }
221         if (pNode->pLeft == NULL && pNode->element > pNode->pParent->element)
222         {
223             pNode->pParent->pRight = pNode->pRight;
224             delete pNode;
225             pNode = NULL;
226             return SUCCESS;
227         }
228         if (pNode->pRight == NULL && pNode->element < pNode->pParent->element)
229         {
230             pNode->pParent->pLeft = pNode->pLeft;
231             delete pNode;
232             pNode = NULL;
233             return SUCCESS;
234         }
235         if (pNode->pRight == NULL && pNode->element > pNode->pParent->element)
236         {
237             pNode->pParent->pRight = pNode->pLeft;
238             delete pNode;
239             pNode = NULL;
240             return SUCCESS;
241         }
242         if (pNode->pParent == NULL)
243         {
244             TreeNode<T>* Temp = pNode->pRight;
245             while (Temp->pLeft != NULL)
246             {
247                 Temp = Temp->pLeft;
248             }
249             Temp->pLeft = pNode->pLeft->pRight;
250             pNode->pLeft->pRight = pNode->pRight;
251             pNode->pLeft->pParent = pNode->pParent;
252             this->m_pRoot = pNode->pLeft;
253             delete pNode;
254             pNode = NULL;
255             Temp = NULL;
256             return SUCCESS;
257             return SUCCESS;
258         }
259         else
260         {
261             TreeNode<T>* Temp = pNode->pRight;
262             pNode->pParent->pLeft = pNode->pLeft;
263             while (Temp->pLeft != NULL)
264             {
265                 Temp = Temp->pLeft;
266             }
267             Temp->pLeft = pNode->pLeft->pRight;
268             pNode->pLeft->pRight = pNode->pRight;
269             pNode->pLeft->pParent = pNode->pParent;
270             delete pNode;
271             pNode = NULL;
272             Temp = NULL;
273             return SUCCESS;
274         }
275         return SUCCESS;
276     }
277     
278 
279     if (element < pNode->element)
280     {
281         DeleteNode(element, pNode->pLeft);
282     }
283     else
284     {
285         DeleteNode(element, pNode->pRight);
286     }
287 
288     return SUCCESS;
289 }

 

转载于:https://www.cnblogs.com/louzi/p/11261245.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值