二叉树的遍历

来源:互联网 发布:手机淘宝不能登录原因 编辑:程序博客网 时间:2024/06/06 01:42

1. 代码


#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100struct TreeNode{char ch;int ispop;//为后续遍历的非递归算法所准备,记录是否已出栈 struct TreeNode *left;struct TreeNode *right;};typedef struct TreeNode node;typedef struct TreeNode* link;//创建树link creatTree(){link p;char ch= getchar();if (ch!='0'&&ch!='\n'){p=(link)malloc(sizeof(node));p->ch=ch;p->left=creatTree();p->right=creatTree();p->ispop=0; //用于后序非递归}else p=NULL;return p;}//广义表的形式输出树 void show(link t){if(t!=NULL){printf("%c",t->ch);if(t->left||t->right){printf("(");show(t->left);if(t->right!=NULL)printf(",");show(t->right);printf(")");}}}//前序遍历 void DLR(link t){if(t){//printf()在I,II,III位置对应DLR,LDR,LRD printf("%3c", t->ch);//IDLR(t->left);//IIDLR(t->right);//I}}//中序遍历 void LDR2(link t){//这里top=0时为空栈;stack[1]存储第一个元素 link stack[MAXSIZE];int top=0;if(!t){printf("树为空!\n");exit(0);}link p=t;while(p||top)//while(!(t==NULL&&top==0)){while(p){/*=====DLR==============printf("%3c",p->ch);=======================*///入栈前,判断未满 if(top<MAXSIZE-1)stack[++top]=p;//stack[top++]可对应下面 stack[--top],此时栈从stack[0]开始存储 else{printf("栈溢出!\n");exit(1);}p=p->left;}//出栈前,判断非空 if(top<=0)exit(0);/*==========DLR============elsep=stack[top--]->right;================================*/else{p=stack[top--];printf("%3c",p->ch);p=p->right;}}  }//后序遍历 void LRD2(link t){link stack[MAXSIZE], p=t;int top=0;if(!p) {printf("空树!\n");exit(0); }//外循环;直到全部退栈即栈空 do {//内循环1;入栈,直到左子树为空的节点while(p){if(top<MAXSIZE-1)stack[top++]=p;//所以,栈顶元素下标为top-1 else{printf("栈溢出!\n");exit(1);}p=p->left;}//内循环2;直到不满足出栈条件//出栈条件:栈顶元素无右孩子,或右孩子已出栈//top!=0应对根节点,防止根节点退栈后while死循环while( top !=0 && (stack[top-1]->right==NULL || stack[top-1]->right->ispop==1) ){p=stack[--top];printf("%3c", p->ch);p->ispop=1; //出栈的做标记 } if(top)//应对根节点 p=stack[top-1]->right;//p由栈顶元素右子树根节点进入外层循环}while(top!=0);}int main(){printf("按先序输入节点,虚节点用0表示\n");link t1=creatTree();printf("输出树\n广义表的形式:\n");show(t1);printf("\n先序(递归):\n");DLR(t1);printf("\n中序(非递归):\n");LDR2(t1);printf("\n后序(非递归):\n");LRD2(t1); return 0;}

2. 结果