[数据结构]二叉树自学
2015-06-20 23:36
495 查看
/* Name:二叉树自学 Actor:HT Time:2015年6月13日 Error Reporte: 1.sscanf(初始地址,"数据类型%d",接收地址); } */ #include"stdio.h" #include"conio.h" #include"string.h" #include"stdlib.h" #include"iostream" #include"windows.h" #include"queue" using namespace std; struct treenode { int value; treenode *left,*right; }; /////////////////////////////////////////////////////////////////////////////////////////////////// treenode* newnode() { treenode *tnode=(treenode *)malloc(sizeof(treenode)); if(tnode!=NULL) { tnode->value=0; tnode->left=NULL; tnode->right=NULL; return tnode; } else { cout<<"false"; Sleep(3000); exit(0); } } void addnode(int val,char *s,treenode *& r) { int i; treenode *temp=r; //暂存根部 for(i=0;s[i]!='\0';i++) { if(s[i]=='l') { if(r->left==NULL) r->left=newnode(); r=r->left; } else if(s[i]=='r') { if(r->right==NULL) r->right=newnode(); r=r->right; } } r->value=val; r=temp; //f找回根部 } treenode *buildtree() { treenode *troot=newnode(); char s[15]; cout<<"Please input the tree in any order you want,just like this:"<<endl; cout<<"5,r 9,l 32, 14,ll 4,lr 7,rl end\n"<<endl; fflush(stdin); while(scanf("%s",s)==1) { //cout<<s<<endl; if(s[0]=='e') return troot; int val; sscanf(s,"%d",&val); //cout<<val<<endl; addnode(val,strchr(s,',')+1,troot); } return troot; } /////////////////////////////////////////////////////////////////////////////////////////////////// void pretree(treenode *r) { if (r==NULL) return; cout<<r->value<<" "; pretree(r->left); pretree(r->right); } /////////////////////////////////////////////////////////////////////////////////////////////////// void deletetree(treenode *r) { if(r!=NULL) { deletetree(r->left); deletetree(r->right); free(r); } return; } /////////////////////////////////////////////////////////////////////////////////////////////////// void pip(char* s,char* s1,char* s2,int n) { if (n<=0) return; int nleft=(strchr(s2,s1[0])-s2); //cout<<nleft<<endl; //精彩之处:字符串名字是指针,其差值就是字符个数!! s[n-1]=s1[0]; //cout<<s[n-1]<<endl; pip(s,s1+1,s2,nleft); pip(s+nleft,s1+nleft+1,s2+nleft+1,n-1-nleft); } void prein_posttree(treenode *r) { int n; char s[25],s1[25],s2[25]; cout<<"请输入先序字符串,如DBACEGF:\n"; cin>>s1; cout<<"请输入中序字符串,如ABCDEFG:\n" ; cin>>s2; n=strlen(s1); //cout<<n<<endl; pip(s,s1,s2,n); s ='\0'; cout<<s<<endl; } /////////////////////////////////////////////////////////////////////////////////////////////////// void BFS(treenode *r) { int i; queue<treenode*> q; q.push(r); for(i=0;i<q.size();i++) { cout<<q.front()->value<<" "; if(q.front()->left!=NULL) q.push(q.front()->left); if(q.front()->right!=NULL) q.push(q.front()->right); q.pop(); i--; } cout<<endl; } /////////////////////////////////////////////////////////////////////////////////////////////////// int main() { int i=1; treenode *root=NULL; while(i) { system("cls"); cout<<"1 新建二叉树\n"; cout<<"2 在1的基础上先序遍历\n"; cout<<"3 给出先序中序,输出后序\n"; cout<<"4 在1的基础上BFS\n\n"; cin>>i; if(i==1) { deletetree(root); root=buildtree(); } if(i==2) { pretree(root); fflush(stdin); getchar(); } if(i==3) { prein_posttree(root); fflush(stdin); getchar(); } if(i==4) { BFS(root); fflush(stdin); getchar(); } } deletetree(root); return 0; }
相关文章推荐
- 线性表子系统
- 数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算
- 数据结构——链式队列(c++)
- 斐波那契查找(超详解)
- 数据结构——循环队列(c++)
- 数据结构——链式栈(c++)
- 第2章 算法入门
- To_review_100_1---KMP算法的整理
- 数据结构——顺序栈(c++)
- Esper入门简介:三、 对Esper底层数据结构特点分析,数据的入、出
- Redis内部数据结构详解之压缩链表(ziplist)
- 算法竞赛入门经典之stl重的常用数据结构----->set
- [数据结构]栈之顺序栈的类模板实现
- Codeforces Round #285 (Div. 1)B. Misha and Permutations Summation(数学+数据结构打脸)
- leetcode--Binary Search Tree Iterator
- 【PAT】自测3 数组元素循环右移
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture