二叉树结构体
typedef struct BitNode{
char data;
struct BitNode *lchild, *rchild;
BitNode(){
lchild = rchild = NULL;
}
}BitNode, *BiTree;
注意这里面的下方的BitNode代表(struct BitNode),BiTree代表(struct BitNode的指针).直接上程序代码,没有什么特别的难点,除了后序非递归遍历需要些2个栈进行维护可能处理需要操作多一点,考研不容易呀!!
#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
//递归建树,输入节点顺序就是二叉树先序遍历的顺序
void CreatBiTree(BiTree &T){
char data;
scanf("%c", &data);
if(data == '#') T = NULL; //'#'代表空节点
else{
T = (BiTree)malloc(sizeof(BitNode));
T->data = data;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void PreOrder(BiTree &T){
if(T != NULL){
printf("%c ", T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree &T){
if(T != NULL){
InOrder(T->lchild);
printf("%c ", T->data);
InOrder(T->rchild);
}
}
void PostOrder(BiTree &T){
if(T != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ", T->data);
}
}
void PreOrder2(BiTree T){
stack <BiTree> S;
BiTree p = T; //遍历指针
//栈和p不为空时循环
while(p || !S.empty()){
if(p != NULL){
S.push(p);
printf("%c ", p->data);
p = p->lchild;
}
else{
p = S.top();
p = p->rchild;
//用栈中存过的节点找到右孩子后那么这个节点已经失去价值,那么直接出栈就可以了
S.pop();
}
}
}
void InOrder2(BiTree T){
stack <BiTree> S;
BiTree p = T;
while(p || !S.empty()){
if(p != NULL){
S.push(p);
p = p->lchild;
}
else{
p = S.top();
printf("%c ", p->data);
p = p->rchild;
//同理,只要找到右节点那么直接丢弃就可以了
S.pop();
}
}
}
void PostOrder2(BiTree T){
stack <BiTree> S1;
stack <int> S2; //存放右节点是否被访问过,访问过用1表示,否则用0表示
BiTree p = T;
while(p || !S1.empty()){
while(p){ //把所有左节点存进去,到这里是一定要保证该点是没有被访问过左节点的节点
S1.push(p);
S2.push(0);
p = p->lchild;
}
while(!S2.empty() && S2.top()){ //如果没有右节点或者右节点被访问过
printf("%c ", S1.top()->data);
S1.pop(), S2.pop();
}
if(!S1.empty()){
S2.pop();
S2.push(1); //此时应该将此点标记为右孩子已经访问过
p = S1.top()->rchild;
}
}
}
void LevelOrder(BiTree T){
queue <BiTree> que;
que.push(T);
while(!que.empty()){
BiTree cur = que.front(); que.pop();
printf("%c ", cur->data);
if(cur->lchild != NULL) que.push(cur->lchild);
if(cur->rchild != NULL) que.push(cur->rchild);
}
}
int main(){
//测试样例:ABC##D##EF###
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif // LOCAL
BiTree root;
CreatBiTree(root);
printf("递归前序遍历\n");
PreOrder(root);
cout << endl;
printf("递归中序遍历\n");
InOrder(root);
cout << endl;
printf("递归后序遍历\n");
PostOrder(root);
cout << endl;
printf("非递归前序遍历\n");
PreOrder2(root);
cout << endl;
printf("非递归中序遍历\n");
InOrder2(root);
cout << endl;
printf("非递归后序遍历\n");
PostOrder2(root);
cout << endl;
printf("层次遍历\n");
LevelOrder(root);
cout << endl;
return 0;
}