数据结构——二叉树的基本操作
2017-05-17 12:32
621 查看
二叉树的非递归遍历用到了栈和队列,这里为了方便,当然也是为了代码尽可能短和提高效率,用到了C++STL里面的栈和队列,不感觉麻烦的,也可以自己手写栈和队列
栈:http://blog.csdn.net/qq_34287501/article/details/72368962
队列:http://blog.csdn.net/qq_34287501/article/details/72370710
#include<bits/stdc++.h>
#define N 5
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct f_node
{
BiTree bitree;
char f;
}f_node, *ff_node;
void menu()
{
printf("\t1.先序遍历\n");
printf("\t2.中序遍历\n");
printf("\t3.后序遍历\n");
printf("\t4.先序遍历(非递归)\n");
printf("\t5.中序遍历(非递归)\n");
printf("\t6.后序遍历(非递归)\n");
printf("\t7.层次遍历\n");
printf("\t8.退出\n");
}
void CreatBiTree(BiTree &T)
{
char ch;
scanf(" %c", &ch);
if(ch == '#') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void PreOrder(BiTree T)
{
if(T == NULL) return ;
printf("%c ", T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
void Inorder(BiTree T)
{
if(T == NULL) return ;
Inorder(T->lchild);
printf("%c ", T->data);
Inorder(T->rchild);
}
void PostOrder(BiTree T)
{
if(T == NULL) return ;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ", T->data);
}
void PreOrder2(BiTree T)
{
stack<BiTree> s;
BiTree q = T;
while(q || !s.empty())
{
if(q)
{
printf("%c ", q->data);
s.push(q);
q = q->lchild;
}
else
{
q = s.top(); s.pop();
q = q->rchild;
}
}
}
void Inorder2(BiTree T)
{
stack<BiTree> s;
BiTree q = T;
while(q || !s.empty())
{
if(q)
{
s.push(q);
q = q->lchild;
}
else
{
q = s.top(); s.pop();
printf("%c ", q->data);
q = q->rchild;
}
}
}
void PostOrder2(BiTree T)
{
stack<ff_node> s;
BiTree q = T;
while(q || !s.empty())
{
while(q)
{
ff_node f = (ff_node)malloc(sizeof(f_node));
f->bitree = q;
f->f = 'L';
s.push(f);
q = q->lchild;
}
while(!s.empty() && (s.top()->f == 'R'))
{
ff_node f = s.top(); s.pop();
printf("%c ", f->bitree->data);
}
if(!s.empty())
{
ff_node f = s.top();
4000
q = f->bitree;
f->f = 'R';
q = q->rchild;
}
}
}
void LevelOrder(BiTree T)
{
queue<BiTree> q;
q.push(T);
while(!q.empty())
{
T = q.front(); q.pop();
printf("%c ", T->data);
if(T->lchild) q.push(T->lchild);
if(T->rchild) q.push(T->rchild);
}
}
int main()
{
BiTree T;
printf("\t初始化(例如:ABC##DE#G##F###, #代表左(右)子树为空):\n");
CreatBiTree(T);
while(true)
{
menu();
int sel;
scanf("%d", &sel);
switch(sel)
{
case 1: PreOrder(T); cout << endl; break;
case 2: Inorder(T); cout << endl; break;
case 3: PostOrder(T); cout << endl; break;
case 4: PreOrder2(T); cout << endl; break;
case 5: Inorder2(T); cout << endl; break;
case 6: PostOrder2(T); cout << endl; break;
case 7: LevelOrder(T); cout << endl; break;
}
if(sel == 8) break;
}
return 0;
}
栈:http://blog.csdn.net/qq_34287501/article/details/72368962
队列:http://blog.csdn.net/qq_34287501/article/details/72370710
#include<bits/stdc++.h>
#define N 5
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct f_node
{
BiTree bitree;
char f;
}f_node, *ff_node;
void menu()
{
printf("\t1.先序遍历\n");
printf("\t2.中序遍历\n");
printf("\t3.后序遍历\n");
printf("\t4.先序遍历(非递归)\n");
printf("\t5.中序遍历(非递归)\n");
printf("\t6.后序遍历(非递归)\n");
printf("\t7.层次遍历\n");
printf("\t8.退出\n");
}
void CreatBiTree(BiTree &T)
{
char ch;
scanf(" %c", &ch);
if(ch == '#') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void PreOrder(BiTree T)
{
if(T == NULL) return ;
printf("%c ", T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
void Inorder(BiTree T)
{
if(T == NULL) return ;
Inorder(T->lchild);
printf("%c ", T->data);
Inorder(T->rchild);
}
void PostOrder(BiTree T)
{
if(T == NULL) return ;
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ", T->data);
}
void PreOrder2(BiTree T)
{
stack<BiTree> s;
BiTree q = T;
while(q || !s.empty())
{
if(q)
{
printf("%c ", q->data);
s.push(q);
q = q->lchild;
}
else
{
q = s.top(); s.pop();
q = q->rchild;
}
}
}
void Inorder2(BiTree T)
{
stack<BiTree> s;
BiTree q = T;
while(q || !s.empty())
{
if(q)
{
s.push(q);
q = q->lchild;
}
else
{
q = s.top(); s.pop();
printf("%c ", q->data);
q = q->rchild;
}
}
}
void PostOrder2(BiTree T)
{
stack<ff_node> s;
BiTree q = T;
while(q || !s.empty())
{
while(q)
{
ff_node f = (ff_node)malloc(sizeof(f_node));
f->bitree = q;
f->f = 'L';
s.push(f);
q = q->lchild;
}
while(!s.empty() && (s.top()->f == 'R'))
{
ff_node f = s.top(); s.pop();
printf("%c ", f->bitree->data);
}
if(!s.empty())
{
ff_node f = s.top();
4000
q = f->bitree;
f->f = 'R';
q = q->rchild;
}
}
}
void LevelOrder(BiTree T)
{
queue<BiTree> q;
q.push(T);
while(!q.empty())
{
T = q.front(); q.pop();
printf("%c ", T->data);
if(T->lchild) q.push(T->lchild);
if(T->rchild) q.push(T->rchild);
}
}
int main()
{
BiTree T;
printf("\t初始化(例如:ABC##DE#G##F###, #代表左(右)子树为空):\n");
CreatBiTree(T);
while(true)
{
menu();
int sel;
scanf("%d", &sel);
switch(sel)
{
case 1: PreOrder(T); cout << endl; break;
case 2: Inorder(T); cout << endl; break;
case 3: PostOrder(T); cout << endl; break;
case 4: PreOrder2(T); cout << endl; break;
case 5: Inorder2(T); cout << endl; break;
case 6: PostOrder2(T); cout << endl; break;
case 7: LevelOrder(T); cout << endl; break;
}
if(sel == 8) break;
}
return 0;
}
相关文章推荐
- 数据结构—二叉树基本操作
- 数据结构——二叉树的基本操作
- 南邮数据结构实验6.1二叉树的基本操作
- 数据结构——排序/搜索二叉树(非递归)的基本操作实现
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- 数据结构之树和二叉树---二叉树的基本操作
- 【数据结构笔记】二叉树的基本操作
- 数据结构——二叉树的基本操作
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- 数据结构——c语言描述 第六章(1)二叉树树的基本操作和二叉树的线索化
- 数据结构.二叉树的基本操作(C语言实现)
- C++二叉树结构的建立与基本操作
- B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
- 数据结构——几种链表基本操作
- 数据结构之顺序表的基本操作
- (总结)数据结构之链表的基本操作说明和示例(待补充)
- 实战数据结构(5)_双向循环链表的基本操作
- 数据结构——单链表的基本操作
- matlab基本操作 关键字 特殊变量 常用命令 数据结构
- 数据结构——栈的基本操作