代码积累日志!
http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 这里都有介绍二叉树的基本概念!
下面看二叉树数据结构:
#define Type char typedef struct BiTNode{ Type data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef struct{ BiTree data; bool is; }PostNode;
下面看二叉树基本操作:
BiTree CreateTree() { BiTree T = NULL; Type e; cout << "请输入数据(#结束):"; cin >> e; if(e != '#') { T = (BiTree)malloc(sizeof(BiTNode)); T->data = e; T->lchild = CreateTree(); T->rchild = CreateTree(); } else return NULL; return T; } void MakeEmpty(BiTree &T) { if(T) { if(T->lchild) MakeEmpty(T->lchild); if(T->rchild) MakeEmpty(T->rchild); free(T); T = NULL; } } void Find(BiTree T,Type e) { if(T->data == e) { cout << "yes" << endl; return ; } else { if(T->lchild) Find(T,e); if(T->rchild) Find(T,e); } cout << "no" << endl; }
下面看前序遍历的递归和非递归操作:
非递归操作需要用到stack结构。
void PreOrderTraverse(BiTree T) { if(!T) return ; cout << T->data << endl; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } void PreOrderTraverse2(BiTree T) { stack<BiTNode*> s; BiTree q = T; while(q != NULL || !s.empty()) { while(q != NULL) { cout << q->data << endl; s.push(q); q = q->lchild; } if(!s.empty()) { q = s.top(); s.pop(); q = q->rchild; } } }
下面看中序遍历的递归和非递归操作:
非递归需要stack结构。
void InOrderTraverse(BiTree T) { if(T == NULL) return ; InOrderTraverse(T->lchild); cout << T->data << endl; InOrderTraverse(T->rchild); } void InOrderTraverse2(BiTree T) { stack<BiTNode*> s; BiTree q = T; while(q != NULL || !s.empty()) { while(q != NULL) { s.push(q); q = q->lchild; } if(!s.empty()) { q = s.top(); cout << q->data << endl; s.pop(); q = q->rchild; } } }
非递归也用到stack,这里较麻烦。
void PostOrderTraverse(BiTree T) { if(T == NULL) return ; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout << T->data << endl; } void PostOrderTraverse2(BiTree T) { stack<PostNode*> s; PostNode* postq; BiTree q = T; while(q != NULL || !s.empty()) { while(q != NULL) { PostNode *postq = (PostNode*)malloc(sizeof(PostNode)); postq->data = q; postq->is = true; s.push(postq); q = q->lchild; } if(!s.empty()) { postq = s.top(); s.pop(); if(postq->is == true) { postq->is = false; s.push(postq); q = postq->data->rchild; } else { cout << postq->data->data << endl; q = NULL; } } } }
下面看层序遍历:
此处需要用到队列deque。
void LayerOrderTraverse(BiTree T) { deque<BiTree> q; BiTree p; if(T) { q.push_back(T); } else return; while(!q.empty()) { p = q.front(); q.pop_front(); cout << p->data << endl; if(p->lchild) { q.push_back(p->lchild); } if(p->rchild) { q.push_back(p->rchild); } } }
2013.8.2
jofranks 于南昌