二叉树的递归与非递归遍历算法
来源:互联网 发布:vr合成软件 编辑:程序博客网 时间:2024/05/20 21:20
/*二叉树的遍历**/ #include <iostream>#include<string.h>#include<stack> using namespace std;typedef struct node{ char data; struct node *lchild,*rchild;}BinTree;typedef struct node1{ BinTree *btnode; bool isFirst;}BTNode;void creatBinTree(char *s,BinTree *&root) //创建二叉树,s为形如A(B,C(D,E))形式的字符串 { int i; bool isRight=false; stack<BinTree*> s1; //存放结点 stack<char> s2; //存放分隔符 BinTree *p,*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]); isRight=false; } else if(s[i]==',') { isRight=true; } else if(s[i]==')') { s1.pop(); s2.pop(); } else if(isalpha(s[i])) { p=(BinTree *)malloc(sizeof(BinTree)); 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++; } }void display(BinTree *root) //显示树形结构 { if(root!=NULL) { cout<<root->data; if(root->lchild!=NULL) { cout<<'('; display(root->lchild); } if(root->rchild!=NULL) { cout<<','; display(root->rchild); cout<<')'; } }}void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }}void inOrder1(BinTree *root) //递归中序遍历{ if(root!=NULL) { inOrder1(root->lchild); cout<<root->data<<" "; inOrder1(root->rchild); }} void postOrder1(BinTree *root) //递归后序遍历{ if(root!=NULL) { postOrder1(root->lchild); postOrder1(root->rchild); cout<<root->data<<" "; } } void preOrder2(BinTree *root) //非递归前序遍历 { stack<BinTree*> s; BinTree *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 inOrder2(BinTree *root) //非递归中序遍历{ stack<BinTree*> s; BinTree *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 postOrder2(BinTree *root) //非递归后序遍历{ stack<BTNode*> s; BinTree *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 postOrder3(BinTree *root) //非递归后序遍历{ stack<BinTree*> s; BinTree *cur; //当前结点 BinTree *pre=NULL; //前一次访问的结点 s.push(root); while(!s.empty()) { cur=s.top(); if((cur->lchild==NULL&&cur->rchild==NULL)|| (pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))) { cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过 s.pop(); pre=cur; } else { if(cur->rchild!=NULL) s.push(cur->rchild); if(cur->lchild!=NULL) s.push(cur->lchild); } } }int main(int argc, char *argv[]){ char s[100]; while(scanf("%s",s)==1) { BinTree *root=(BinTree *)malloc(sizeof(BinTree)); creatBinTree(s,root); display(root); cout<<endl; preOrder2(root); cout<<endl; inOrder2(root); cout<<endl; postOrder2(root); cout<<endl; postOrder3(root); cout<<endl; } return 0;}
0 0
- 遍历二叉树的递归算法与非递归算法
- 二叉树遍历的递归与非递归算法
- 二叉树的递归遍历与非递归算法实现
- 二叉树的递归遍历与非递归算法实现
- 二叉树的遍历算法(递归与非递归)
- 遍历二叉树的递归与非递归算法
- 二叉树的递归与非递归遍历算法
- 二叉树遍历的递归与非递归算法
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 遍历二叉树递归算法与非递归算法
- 【数据结构与算法】二叉树递归与非递归遍历
- 【算法设计-二叉树遍历】二叉树的递归与非递归遍历方法
- 二叉树三种遍历的递归与非递归算法
- 二叉树前序遍历的递归与非递归算法
- 二叉树遍历的非递归算法
- 遍历二叉树的非递归算法
- 遍历二叉树的非递归算法
- 二叉树的遍历非递归算法
- Python之使用subprocess处理shell命令
- Elasticsearch 的安装和基本使用
- 1023
- Ubuntu16.04安装Redis
- iOS 多线程编程<十四、SDWebImage图片下载,内存警告处理>
- 二叉树的递归与非递归遍历算法
- Windows Server 2016、System Center 2016正式发布了
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- python 给字典 添加元素
- 1024
- iOS开发- "duplicate symbol for architecture i386" 解决办法
- 使用Mybatis时,在插入一条数据记录返回主键id值
- 求各位大神,这种乱码怎么解决?是安卓项目的!!急急急!!
- 各种面试最基本网络问题