小白书之二叉树指针法构建二叉树以及二叉树先序遍历
来源:互联网 发布:按键精灵免费网络验证 编辑:程序博客网 时间:2024/05/01 18:14
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cctype>#include<cmath>#include<map>#include<set>#include<vector>#include<queue>#include<stack>#define LL __int64using namespace std;const double pi=4*atan(1.0);const int MAXN=1001;/*typedef struct TNode{ int have_value; int v; struct TNode *left,*right;}Node;Node *root;Node* newnode(){ Node *u=(Node *)malloc(sizeof(Node)); if(u!=NULL) { u->have_value=0; u->left=u->right=NULL; } return u;}int failed=0;void addnode(int v,char *s){ // cout<<"hehe"<<endl; int n=strlen(s); Node* u=root; // cout<<s<<endl; for(int i=0;i<n;i++) { if(s[i]=='L') { if(u->left==NULL) u->left=newnode(); u=u->left; } else if(s[i]=='R') { if(u->right==NULL) u->right=newnode(); u=u->right; } // cout<<"hehe"<<endl; } if(u->have_value) failed=1; u->v=v; u->have_value=1;}char s[maxn+10];int read_input(){ failed=0; root=newnode(); for(;;) { if(scanf("%s",s)!=1) return 0; if(!strcmp(s,"()")) break; int v; sscanf(&s[1],"%d",&v); addnode(v,strchr(s,',')+1); } return 1;}int n=0,ans[maxn];int bfs(){ int front=0,rear=1; Node *q[maxn]; q[0]=root; while(front<rear) { Node *u=q[front++]; if(!u->have_value) return 0; ans[n++]=u->v; if(u->left!=NULL) q[rear++]=u->left; if(u->right!=NULL) q[rear++]=u->right; } return 1;}void remove_tree(Node *u){ if(u==NULL) return; remove_tree(u->left); remove_tree(u->right); free(u);}int main(){ while(read_input()) { // cout<<"hehe"<<endl; if(failed||!bfs()) { cout<<-1<<endl; } else { for(int i=0;i<n;i++) cout<<ans[i]<<' '; cout<<endl; } remove_tree(root); } return 0;}*/int have_value[MAXN];int v[MAXN];int lleft[MAXN],rright[MAXN];const int root=1;int cnt;int failed;void newtree(){ lleft[root]=rright[root]=0;cnt=root;}int newnode(){ int u=++cnt; lleft[u]=rright[u]=0; return u;}void addnode(int t,char *s){ int n=strlen(s); int u=root; for(int i=0;i<n;i++) { if(s[i]=='L') { if(!lleft[u]) { lleft[u]=newnode(); } u=lleft[u]; } if(s[i]=='R') { if(!rright[u]) { rright[u]=newnode(); } u=rright[u]; } } if(have_value[u]) failed=1; v[u]=t; have_value[u]=1;}char s[MAXN];int read_input(){ newtree(); memset(have_value,0,sizeof(have_value)); failed=0; for(;;) { if(scanf("%s",s)!=1) return 0; if(!strcmp(s,"()")) break; int v; sscanf(&s[1],"%d",&v); addnode(v,strchr(s,',')+1); } return 1;}int n,ans[MAXN];int bfs(){ n=0; int front=0,rear=1; int q[MAXN]; q[0]=1; while(front<rear) { int u=q[front++]; // cout<<u<<endl; if(!have_value[u]) return 0; ans[n++]=v[u]; if(lleft[u]) q[rear++]=lleft[u]; if(rright[u]) q[rear++]=rright[u]; } return 1;}int main(){ while(read_input()) { // for(int i=1;i<=cnt;i++) // cout<<v[i]<<' '; if(failed||!bfs()) { cout<<-1<<endl; } else { for(int i=0;i<n;i++) cout<<ans[i]<<' '; cout<<endl; } } return 0;}
0 0
- 小白书之二叉树指针法构建二叉树以及二叉树先序遍历
- 二叉树遍历&构建
- java二叉树的构建以及遍历
- 二叉树之构建与遍历
- [C++ 二叉树的构建与遍历] 数据结构实验之二叉树二:遍历二叉树
- 二叉树构建与遍历
- 层次遍历构建二叉树
- 构建二叉树及遍历
- 查找树(二叉树)的构建以及分层遍历
- 数据结构(9):二叉树的遍历、构建以及显示(凹入法)
- 二叉树以及遍历算法
- 二叉树创建以及遍历
- 二叉树的构建 遍历 以及 根据 先序遍历 中序遍历 来构建二叉树
- 二叉树的性质极其二叉树的构建、各种遍历以及深度宽度的求解
- BinaryTree的构建和遍历,以及搜索删除(非完全二叉树,非平衡二叉树)
- 二叉树的二叉链表存储结构构建以及先序遍历
- 重建二叉树(根据前序中序遍历构建二叉树)
- 构建二叉树、二叉树的深度、广度优先遍历
- JAVA IO操作关键点
- NYOJ 22-素数求和问题
- java 基础(环境变量、)
- nyoj448 寻找最大数
- Ubutu vim不好用的解决办法
- 小白书之二叉树指针法构建二叉树以及二叉树先序遍历
- POJ 3126 Prime Path(BFS)
- Liunx下安装Apache mysql pHp服务
- SkipList跳表
- java中IO流学习小结
- 最长上升子序列 LIS(Longest Increasing Subsequence)(转)
- hdu 1212 Big Number 大数取模
- hdu-5391 Zball in Tina Town 找规律(求素数)
- lr_eval_string函数在订飞机票中的例子-返回脚本中参数的值