【数据结构实验】二叉树的遍历(数组版)

来源:互联网 发布:mac玩游戏卡 编辑:程序博客网 时间:2024/05/01 04:46


#include <iostream>using namespace std;typedef char TElemType;typedef int Status;#define OK 1#define ERROR 0#define OVERLOW -2typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild;//左右孩子指针}BiTNode, *BiTree;//================================================================================Status CreatBiTree(BiTree &T)//按次序输入二叉树中结点值,#表示空树{ TElemType ch; cin >> ch;  if (ch == '#')   T = NULL;  else  {   if (!(T = (BiTNode *)malloc(sizeof(BiTree))))    exit(OVERLOW);   T->data = ch;            //生成根结点   CreatBiTree(T->lchild);//构造左子树   CreatBiTree(T->rchild);//构造右子树  } return OK;}//CreatBiTree//==================================================================================Status PreOrderTraverse1(BiTree T)//递归方法  先序遍历二叉树(输出){ if (T != NULL) {  cout << T->data;  PreOrderTraverse1(T->lchild);  PreOrderTraverse1(T->rchild); } return OK;}//PreOrderTraverse1//==================================================================================Status PreOrderTraverse2(BiTree T)//非递归方法  先序遍历二叉树(输出){ BiTree p; p = T; BiTree stack[20]; int num = 0; while (p != NULL || num > 0) {  while (p != NULL)  {   cout << p->data;   stack[num++] = p;   p = p->lchild;  }  num--;  p = stack[num];  p = p->rchild; } cout << endl; return OK;}//PreOrderTraverse2//==================================================================================Status InOrderTraverse1(BiTree T)//递归方法  中序遍历二叉树(输出){ if (T != NULL) {  InOrderTraverse1(T->lchild);  cout << T->data;  InOrderTraverse1(T->rchild); } return OK;}//InOrderTraverse1//==================================================================================Status InOrderTraverse2(BiTree T)//非递归方法  中序遍历二叉树(输出){ BiTree p; p = T; BiTree stack[20]; int num = 0; while (p != NULL || num > 0) {  while (p != NULL)  {   stack[num++] = p;   p = p->lchild;  }  num--;  p = stack[num];  cout << p->data;  p = p->rchild; } cout << endl; return OK;}//InOrderTraverse2//==================================================================================Status PostOrderTraversr1(BiTree T)//递归方法  后序遍历二叉树(输出){ if (T != NULL) {  PostOrderTraversr1(T->lchild);  PostOrderTraversr1(T->rchild);  cout << T->data; } return OK;}//PostOrderTraversr1//==================================================================================Status PostOrderTraversr2(BiTree T)//非递归方法  后序遍历二叉树(输出){ BiTree p; p = T; BiTree stack[20]; int num = 0; BiTree HaveVisited = NULL; while (p != NULL || num > 0) {  while (p != NULL)  {   stack[num++] = p;   p = p->lchild;  }  p = stack[num-1];  if (p->rchild == NULL || HaveVisited == p->rchild)  {   cout << p->data;   num--;   HaveVisited = p;   p = NULL;  }  else   p = p->rchild; } cout << endl; return OK;}//PostOrderTraversr2//==================================================================================int main(){ BiTree T; cout << "请输入结点字符(#表示空树):(如A)" << endl; CreatBiTree(T); cout << "1:递归方法   先序遍历的值为" << endl; PreOrderTraverse1(T); cout << endl; cout << "2:非递归方法 先序遍历的值为" << endl; PreOrderTraverse2(T); cout << "3:递归方法   中序遍历的值为" << endl; InOrderTraverse1(T); cout << endl; cout << "4:非递归方法 中序遍历的值为" << endl; InOrderTraverse2(T); cout << "5:递归方法   后序遍历的值为" << endl; PostOrderTraversr1(T); cout << endl; cout << "6:非递归方法 后序遍历的值为" << endl; PostOrderTraversr2(T); return OK;}


11 0
原创粉丝点击