您的位置:首页 > 理论基础 > 数据结构算法

数据结构——二叉树的基本操作

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: