【数据结构】之一、二叉树创建,前中后序遍历
发布时间:2020-12-15 06:32:14 所属栏目:安全 来源:网络整理
导读:代码积累日志! http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 这里都有介绍二叉树的基本概念! 下面看二叉树数据结构: #define Type chartypedef struct BiTNode{Type data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;typedef struct{
代码积累日志! 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 于南昌 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |