二叉树递归,非递归,前中后遍历
来源:互联网 发布:手机语音通话软件 编辑:程序博客网 时间:2024/05/21 15:07
又是一个数据结构的实验。这个实验要求实现二叉树的前,中,后序递归,非递归遍历。
一开始,想了一个最普遍的做法,其实也是实验题目上的建议。比如,输入1 2 0 0 3 0 0,0表示节点为空。
后来在网上逛了逛,发现这种输入形式的二叉树比较清晰,比如1(2,3) 显然,2是1的左孩子,3是1的右孩子。其实实现的办法也不是很复杂,定义一个字符数组s[100],再定义两个栈,一个用来放节点数据,一个用来放“(”,“,”,“)”,
输出的时候,再加一些判断就可以。下面是源程序,里面有二叉树的前,中,后序递归,非递归遍历的功能,也暂时达到了实验的要求,过段日子打算把左右孩子节点交换,求二叉树节点个数,高度也加进去。
运行结果:
源程序:
#include<iostream>#include<string.h>#include<stack> char s[100];using namespace std;//定义树的节点结构typedef struct node{ char data; //节点数据 struct node *lchild; //指向左孩子的指针struct node *rchild; //指向右孩子的指针}Bin_Tree;typedef struct node1{ Bin_Tree *btnode; bool isFirst;}BTNode; //创建二叉树,s为A(B(C,D))结构的字符串 Bin_Tree *Creat_Tree(char *s,Bin_Tree *&root) { int i; bool isRight=false; stack<Bin_Tree*> s1; //创建BinTree类型栈存放结点 stack<char> s2; //创建char类型栈存放分隔符 Bin_Tree *p;Bin_Tree *temp; root->data=s[0]; root->lchild=NULL; root->rchild=NULL; s1.push(root); //根节点进栈 i=1; while(i<strlen(s)) { if(s[i]=='(') { s2.push(s[i]); //如果输入是"(",就将其放入s2 isRight=false; } else if(s[i]==',') { isRight=true; } else if(s[i]==')') { s1.pop(); s2.pop(); } elseif(isalpha(s[i])) { p=(Bin_Tree *)malloc(sizeof(Bin_Tree)); p->data=s[i]; p->lchild=NULL; p->rchild=NULL; temp=s1.top(); if(isRight==true) { temp->rchild=p; cout<<temp->data<<"的右孩子是"<<s[i]<<endl; } else { temp->lchild=p; cout<<temp->data<<"的左孩子是"<<s[i]<<endl; } if(s[i+1]=='(') s1.push(p); } i++; } return root;}//显示树形结构 //-----------------------------------------void Display_Tree(Bin_Tree *root){ if(root!=NULL) { cout<<root->data; if(root->lchild!=NULL) { cout<<'('; Display_Tree(root->lchild); } if(root->rchild!=NULL) { cout<<','; Display_Tree(root->rchild); cout<<')'; } }}//***************************************//递归前,中,后序遍历//***************************************//递归前序遍历 void preorder(Bin_Tree *root){ if(root!=NULL) { cout<<root->data<<" "; preorder(root->lchild); preorder(root->rchild); }} //递归中序遍历void inorder(Bin_Tree *root){ if(root!=NULL) { inorder(root->lchild); cout<<root->data<<" "; inorder(root->rchild); }} //递归后序遍历void postorder(Bin_Tree *root){ if(root!=NULL) { postorder(root->lchild); postorder(root->rchild); cout<<root->data<<" "; } } //***************************************//非递归前,中,后序遍历//***************************************//非递归前序遍历 void pre_order(Bin_Tree *root){ stack<Bin_Tree*> s; Bin_Tree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { cout<<p->data<<" "; s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); s.pop(); p=p->rchild; } }}//非递归中序遍历void in_order(Bin_Tree *root) { stack<Bin_Tree*> s; Bin_Tree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<p->data<<" "; s.pop(); p=p->rchild; } } } //非递归后序遍历void post_order(Bin_Tree *root) { stack<BTNode*> s; Bin_Tree *p=root; BTNode *temp; while(p!=NULL||!s.empty()) { while(p!=NULL) //沿左孩子一直往下找,直至出现没有左孩子的结点 { BTNode *btn=(BTNode *)malloc(sizeof(BTNode)); btn->btnode=p; btn->isFirst=true; s.push(btn); p=p->lchild; } if(!s.empty()) { temp=s.top(); s.pop(); if(temp->isFirst==true) //表示是第一次出现在栈顶 { temp->isFirst=false; s.push(temp); p=temp->btnode->rchild; } else //第二次出现在栈顶 { cout<<temp->btnode->data<<" "; p=NULL; } } } } //功能界面函数//*****************************************************************void Menu(){int n;loop:cout<<endl<<"输入数字选择功能!"<<endl<<endl;cout<<"1.创建二叉树"<<endl;cout<<"2.显示二叉树"<<endl;cout<<"3.递归实现前,中,后遍历"<<endl;cout<<"4.非递归实现前,中,后遍历"<<endl;cout<<"5.退出程序"<<endl;cout<<endl<<"选择功能: ";cin>>n;if(n==1){cout<<"请输入二叉树(注意!A(B(C,D))结构输入)"<<endl; cin>>s; Bin_Tree *root=(Bin_Tree *)malloc(sizeof(Bin_Tree)); Creat_Tree(s,root);goto loop;}elseif(n==2){Bin_Tree *root=(Bin_Tree *)malloc(sizeof(Bin_Tree));root=Creat_Tree(s,root);cout<<endl<<"所建二叉树的结构是:";Display_Tree(root);cout<<endl;goto loop;}elseif(n==3){ Bin_Tree *root=(Bin_Tree *)malloc(sizeof(Bin_Tree)); root=Creat_Tree(s,root); cout<<endl<<"递归前序遍历:"; preorder(root); cout<<endl<<"递归中序遍历:"; inorder(root); cout<<endl<<"递归后序遍历:"; postorder(root); cout<<endl; goto loop;}elseif(n==4){ Bin_Tree *root=(Bin_Tree *)malloc(sizeof(Bin_Tree));root=Creat_Tree(s,root);cout<<endl<<"非递归前序遍历:"; pre_order(root); cout<<endl<<"非递归前序遍历:"; in_order(root); cout<<endl<<"非递归前序遍历:"; post_order(root); cout<<endl;goto loop;}elseif(n==5){exit(0);}else{cout<<endl<<"不在功能选择范围之内!请重新输入!"<<endl<<endl;goto loop;}}//主函数//************************************************************************int main(){Menu(); return 0;}
- 二叉树递归,非递归,前中后遍历
- 二叉树非递归遍历(前中后)
- 二叉树建立、递归、非递归遍历
- JAVA递归、非递归遍历二叉树
- 非递归、递归遍历二叉树!
- 二叉树的递归,非递归遍历
- 递归 和 非递归 遍历二叉树
- 二叉树 递归 与 非递归 遍历
- 二叉树递归/非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树遍历(层次,递归,非递归)
- 二叉树各种递归非递归遍历
- 二叉树遍历(递归,非递归)
- 二叉树遍历,递归,非递归
- 递归与非递归二叉树遍历
- 二叉树递归与非递归遍历
- 二叉树递归及非递归遍历
- 二叉树的递归非递归遍历
- Android UI设计技巧
- XML文件有关CDATA的使用方法
- Oracle开发专题之:报表函数
- 杨辉三角--char5
- WINNT内核
- 二叉树递归,非递归,前中后遍历
- jxl jsp 导出excel
- java自定义注解
- 我要为E语言程序员正名!我用一句代码证明E语言和VB是同一种语言!
- OCP-1Z0-052-V9.02-177题
- html5 CSS3 渐变按钮
- hw 9.11
- 图片双缓存加载
- 启用Confluence远程接口调用(Remote API)