二叉树
binaryTree.h
1 #ifndef BINARYTREE_H 2 #define BINARYTREE_H 3 4 #include<iostream> 5 using namespace std; 6 7 #include<cstdlib> 8 #include<stack> 9 #include<queue> 10 11 enum Status{ERROR,OK};//定义状态枚举时还得注意实际的值,不能搞错了 12 13 template<class T> 14 Status PrintElement(T e) 15 { 16 cout<<e<<" "; 17 return OK; 18 } 19 20 template<class T> 21 class BiNode//树节点 22 { 23 public: 24 BiNode(); 25 T data; 26 BiNode *left; 27 BiNode *right; 28 }; 29 30 template<class T> 31 BiNode<T>::BiNode() 32 { 33 data = (T)0; 34 left = NULL; 35 right = NULL;//有时候你初始化指针值为NULL,你也没有在后面的语句中刻意去改变该指针值,但指针的值还是可能因为传递到函数作为参数而发生改变,因此如果你要再重新用指针的NULL值,最好在用之前显示地再重新赋值一下才行 36 } 37 38 template<class T> 39 class BiTree 40 { 41 public: 42 BiTree(); 43 Status CreateBiTree(BiNode<T> *&root); 44 Status PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,递归方法 45 Status NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,非递归方法 46 Status InOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,递归方法 47 Status NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,非递归方法 48 Status PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,递归方法 49 Status NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,非递归方法 50 Status LevelTraverse(BiNode<T> *r,Status (*visit)(T element));//层次遍历 51 Status BiTraverse(); 52 ~BiTree(); 53 54 private: 55 BiNode<T> *root;//树根节点 56 }; 57 58 template<class T> 59 BiTree<T>::BiTree() 60 { 61 CreateBiTree(root); 62 } 63 64 template<class T> 65 Status BiTree<T>::CreateBiTree(BiNode<T> *&r)//这里即使是指针也得加&符号,这样才能真正修改root,不然修改不了(还认为是值传递) 66 { 67 r = NULL; 68 T ch; 69 cin>>ch; 70 if(ch != (T)0) 71 { 72 r = new BiNode<T>(); 73 if(r != NULL) 74 { 75 r->data = ch; 76 CreateBiTree(r->left); 77 CreateBiTree(r->right); 78 } 79 } 80 else 81 { 82 r = NULL; 83 //r = new BiNode<T>(); 84 //r->data = (T)0;//这里的左右孩子不存在的节点我们规定其data值为0,方便后面遍历时进行判断,不为0则输出并继续递归,为0则直接返回 85 } 86 return OK; 87 } 88 89 template<class T> 90 Status BiTree<T>::PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历递归方法 91 { 92 if(r != NULL) 93 { 94 if((*visit)(r->data)) 95 { 96 if(PreOrderTraverse(r->left,visit)) 97 { 98 if(PreOrderTraverse(r->right,visit)) 99 { 100 return OK; 101 } 102 } 103 } 104 return ERROR; 105 } 106 else 107 { 108 return OK; 109 } 110 } 111 112 template<class T> 113 Status BiTree<T>::NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历非递归方法(栈) 114 { 115 stack<BiNode<T> *>s; 116 BiNode<T> *temp = r; 117 118 while(true) 119 { 120 while(temp != NULL) 121 { 122 if(temp->right != NULL) 123 { 124 s.push(temp->right); 125 } 126 visit(temp->data); 127 temp = temp->left; 128 } 129 if(!s.empty()) 130 { 131 temp = s.top(); 132 s.pop(); 133 } 134 else 135 { 136 break; 137 } 138 } 139 return OK; 140 } 141 142 template<class T> 143 Status BiTree<T>::InOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,递归方法 144 { 145 if(r != NULL) 146 { 147 if(InOrderTraverse(r->left,visit)) 148 { 149 if((*visit)(r->data)) 150 { 151 if(InOrderTraverse(r->right,visit)) 152 { 153 return OK; 154 } 155 } 156 } 157 return ERROR; 158 } 159 else 160 { 161 return OK; 162 } 163 164 return OK; 165 } 166 167 template<class T> 168 Status BiTree<T>::NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,非递归方法(栈) 169 { 170 stack<BiNode<T> *> s; 171 BiNode<T> *temp; 172 s.push(r); 173 while(!s.empty()) 174 { 175 while((temp = (BiNode<T> *)s.top()) && temp != NULL) 176 { 177 s.push(temp->left); 178 } 179 s.pop(); 180 if(!s.empty()) 181 { 182 temp = s.top(); 183 visit(temp->data); 184 s.pop(); 185 s.push(temp->right); 186 } 187 } 188 189 return OK; 190 } 191 192 template<class T> 193 Status BiTree<T>::PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历递归算法 194 { 195 if(r != NULL) 196 { 197 if(PostOrderTraverse(r->left,visit)) 198 { 199 if(PostOrderTraverse(r->right,visit)) 200 { 201 if((*visit)(r->data)) 202 { 203 return OK; 204 } 205 } 206 } 207 return ERROR; 208 } 209 else 210 { 211 return OK; 212 } 213 214 return OK; 215 } 216 217 template<class T> 218 Status BiTree<T>::NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历非递归算法(栈) 219 { 220 stack<BiNode<T> *> s; 221 BiNode<T> *temp = r;//这里要赋初值不能忘了 222 s.push(temp); 223 while(!s.empty())//任何时候都必须要判定是否为空 224 { 225 while((temp = s.top())&&temp) 226 { 227 s.push(temp->left); 228 } 229 s.pop(); 230 if(!s.empty()) 231 { 232 while(temp == (s.top())->right || (temp == (s.top())->left) && ((s.top())->right == NULL)) 233 { 234 temp = s.top(); 235 visit(temp->data); 236 s.pop(); 237 if(s.empty())//这里是条件一定要判断准确了,是empty()而不是!empty() 238 { 239 break; 240 } 241 } 242 if(!s.empty()) 243 { 244 temp = s.top(); 245 s.push(temp->right); 246 } 247 } 248 else 249 { 250 break; 251 } 252 } 253 254 return OK; 255 } 256 257 template<class T> 258 Status BiTree<T>::LevelTraverse(BiNode<T> *r,Status (*visit)(T element)) 259 { 260 queue<BiNode<T> *> qu; 261 BiNode<T> *temp; 262 if(!r) 263 { 264 qu.push(r); 265 while(!qu.empty()) 266 { 267 temp = qu.front(); 268 visit(temp->data); 269 if(temp->left) 270 { 271 qu.push(temp->left); 272 } 273 if(temp->right) 274 { 275 qu.push(temp->right); 276 } 277 qu.pop(); 278 } 279 } 280 281 return OK; 282 } 283 284 template<class T> 285 Status BiTree<T>::BiTraverse() 286 { 287 cout<<"Recursive traverse:"<<endl; 288 289 cout<<"preorder traverse :"<<endl; 290 PreOrderTraverse(root,PrintElement); 291 292 cout<<endl<<"inorder traverse :"<<endl; 293 InOrderTraverse(root,PrintElement); 294 295 cout<<endl<<"postorder traverse :"<<endl; 296 PostOrderTraverse(root,PrintElement); 297 298 cout<<endl<<"Non-recursive traverse:"<<endl; 299 300 cout<<endl<<"NPreorder traverse:"<<endl; 301 NPreOrderTraverse(root,PrintElement); 302 303 cout<<endl<<"NInorder treaverse:"<<endl; 304 NInOrderTraverse(root,PrintElement); 305 306 cout<<endl<<"NPostorder traverse:"<<endl; 307 NPostOrderTraverse(root,PrintElement); 308 309 cout<<endl<<"Level traverse:"<<endl; 310 LevelTraverse(root,PrintElement); 311 312 return OK; 313 } 314 315 template<class T> 316 BiTree<T>::~BiTree()//最后在析构函数里使用中序非递归遍历算法进行树节点遍历进而释放内存空间 317 { 318 stack<BiNode<T> *> s; 319 BiNode<T> *temp; 320 s.push(r); 321 while(!s.empty()) 322 { 323 while((temp = (BiNode<T> *)s.top()) && temp != NULL) 324 { 325 s.push(temp->left); 326 } 327 s.pop(); 328 if(!s.empty()) 329 { 330 temp = s.top(); 331 delete temp; 332 s.pop(); 333 s.push(temp->right); 334 } 335 } 336 } 337 338 #endif
main.cpp
1 #include<iostream> 2 3 using namespace std; 4 #include<stdlib.h> 5 #include"binaryTree.h" 6 7 int main() 8 { 9 cout<<"please input a series number to create a binarytree :"<<endl; 10 BiTree<int> *t1 = new BiTree<int>();//new永远是返回指针 11 12 t1->BiTraverse(); 13 14 15 system("pause"); 16 return 0; 17 }