山东理工大学 2015级计科、软件《数据结构与算法》实践能力专题训练5:二叉树
来源:互联网 发布:双色球算法公式2017 编辑:程序博客网 时间:2024/04/29 10:55
数据结构实验之二叉树一:树的同构
#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>using namespace std;struct tree{ struct tree *left, *right; char str;};struct node{ char x[10]; char y[10];};bool vis[30];int rootNum( struct node a[], int n ){ int i; for ( i = 0;i < n; i++ ) { if ( a[i].x[0] >= '0'&&a[i].x[0] <= '9' ) //目的查找root1的根节点 vis[a[i].x[0]-'0'] = true; if ( a[i].y[0] >= '0'&&a[i].y[0] <= '9' ) vis[a[i].y[0]-'0'] = true; } for ( i = 0; i < n; i++ ) { if ( vis[i] == false ) return i; }}struct tree *create(struct node a[], int r, char ch[12][10]){ struct tree *root = new tree; root->str = ch[r][0]; root->left = root->right = NULL; if ( a[r].x[0] != '-' ) root->left = create( a, a[r].x[0]-'0', ch ); if ( a[r].y[0] != '-' ) root->right = create( a, a[r].y[0]-'0', ch ); return root;}bool compa(struct tree *root1, struct tree *root2)//比较两颗树是否同构{ if ( !root1 && !root2 ) return 1; if ( (root1 && root2) && root1->str == root2->str ) if ( ( compa(root1->left, root2->left) && compa(root1->right,root2->right) ) || ( compa(root1->left, root2->right) && compa(root1->right,root2->left ) ) ) return 1; return 0;}int main(){ int n, m, xx, yy, i; while ( ~scanf ( "%d", &n ) ) { char ch1[12][10], ch2[12][10]; node a[12], b[12]; memset( vis, false, sizeof(vis) ); for ( i = 0;i < n; i++ ) scanf ( "%s %s %s", ch1[i], a[i].x, a[i].y ); xx = rootNum(a, n); //根节点为ch1[i]; memset( vis, false, sizeof(vis) ); scanf ( "%d", &m ); for ( i = 0;i < m; i++ ) scanf ( "%s %s %s", ch2[i], b[i].x, b[i].y ); yy = rootNum(b, m); if ( n != m ) //如果节点数都不相同就不用比较了 { printf ( "No\n" ); continue; } if ( n == 0 && m == 0 ) //这里我被亮瞎了,我服...十多发WA.做出来以后发现这也可以.... { printf ( "Yes\n" ); continue; } struct tree *root1 = create(a, xx, ch1); struct tree *root2 = create(b, yy, ch2); printf ( compa ( root1,root2 ) ? "Yes\n" : "No\n" ); }}
数据结构实验之二叉树二:遍历二叉树
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct node{ char data; struct node *left, *right;};char st[60];int cnt;struct node *create(){ struct node *root; if ( st[++cnt] == ',' ) root = NULL; else { root = (struct node *)malloc(sizeof(struct node)); root->data = st[cnt]; root->left = create(); root->right = create(); } return root;}void midOrder(struct node *root){ if ( root ) { midOrder(root->left); printf ( "%c", root->data); midOrder(root->right); }}void afterOrder(struct node *root){ if ( root ) { afterOrder(root->left); afterOrder(root->right); printf ( "%c", root->data); }}int main(){ while ( ~scanf ( "%s", st ) ) { cnt = -1; struct node *root; root = create(); midOrder(root); printf ( "\n" ); afterOrder(root); printf ( "\n" ); } return 0;}
数据结构实验之二叉树三:统计叶子数
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct tree{ char data; struct tree *left, *right;};char str[60];int cnt;int sum;struct tree *create(){ struct tree *root = new tree; if ( str[++cnt] == ',' ) return root = NULL; root->data = str[cnt]; root->left = create(); root->right = create(); return root;}void Sum(struct tree *root){ if ( root ) { if ( !root->right && !root->left ) sum++; Sum(root->left); Sum(root->right); }}int main(){ while ( ~scanf ( "%s", str ) ) { cnt = -1; sum = 0; struct tree *root = new tree; root = create(); Sum(root); printf ( "%d\n", sum ); }}数据结构实验之二叉树四:还原二叉树
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct tree{ char data; struct tree *left, *right;};struct tree *create (int len, char *st1, char *st2){ struct tree *root = new tree; int i; if ( len == 0 ) return root = NULL; for ( i = 0;i < len; i++ ) { if ( st1[0] == st2[i] ) break; } root->data = st1[0]; root->left = create(i, st1+1, st2); root->right = create(len-i-1, st1+i+1, st2+i+1); return root;}int deep ( struct tree *root ){ int sum = 0; if ( root ) { int sum1 = deep ( root->left ); int sum2 = deep ( root->right ); sum = max(sum1, sum2)+1; } return sum;}int main(){ int n; char st1[60], st2[60]; while ( ~scanf ( "%d", &n ) ) { scanf ( "%s %s", st1, st2 ); struct tree *root = new tree; root = create(n, st1, st2); int sum = deep ( root ); printf ( "%d\n", sum ); }}
数据结构实验之二叉树五:层序遍历
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct tree{ char data; struct tree *left, *right;};char str[60];int cnt;int sum;struct tree *create(){ struct tree *root = new tree; if ( str[++cnt] == ',' ) return root = NULL; root->data = str[cnt]; root->left = create(); root->right = create(); return root;}void leve(struct tree *root){ struct tree *tr[60]; int in = 0, out = 0; tr[in++] = root; while ( in > out ) { if ( tr[out] ) { printf ( "%c", tr[out]->data ); tr[in++] = tr[out]->left; tr[in++] = tr[out]->right; } out++; }}int main(){ int n; scanf ( "%d", &n ); while ( n-- ) { scanf ( "%s", str ); cnt = -1; sum = 0; struct tree *root = new tree; root = create(); leve(root); printf ( "\n" ); }}
数据结构实验之二叉树六:哈夫曼编码
#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <cstdio>using namespace std;struct cmp{ bool operator()(int &a, int &b) { return a > b; //优先队列从小到大排列 }};priority_queue<int, vector<int>, cmp>q;int b[300];int main(){ int i; int ma1,ma2; char st[10002]; while ( ~scanf ( "%s", st ) ) { memset( b, 0, sizeof(b) ); int len = strlen(st); for ( i = 0;i < len; i++ ) b[st[i]]++; for ( i = 0;i < 300; i++ ) { if ( b[i] != 0 ) q.push(b[i]); } int sum = 0; while ( q.size() != 1 ) { ma1 = q.top(); q.pop(); ma2 = q.top(); q.pop(); sum = ma1+ma2+sum; q.push(ma1+ma2); } q.pop(); printf ( "%d %d %.1lf\n", len*8, sum, (double)len*8/(double)sum ); }}数据结构实验之二叉树七:叶子问题
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct tree{ char data; struct tree *left, *right;};char str[60];int cnt;int sum;struct tree *create(){ struct tree *root = new tree; if ( str[++cnt] == ',' ) return root = NULL; root->data = str[cnt]; root->left = create(); root->right = create(); return root;}void leve(struct tree *root){ struct tree *tr[60]; int in = 0, out = 0; tr[in++] = root; while ( in > out ) { if ( tr[out] ) { tr[in++] = tr[out]->left; tr[in++] = tr[out]->right; } if ( tr[out] ) { if ( !tr[out]->left && !tr[out]->right ) printf ( "%c", tr[out]->data ); } out++; }}int main(){ while ( ~scanf ( "%s", str ) ) { cnt = -1; sum = 0; struct tree *root = new tree; root = create(); leve(root); printf ( "\n" ); }}
代码菜鸟,如有错误,请多包涵!!!
如有帮助记得支持我一下,谢谢!!!
1 0
- 山东理工大学 2015级计科、软件《数据结构与算法》实践能力专题训练5:二叉树
- 山东理工大学 2015计科、软件《数据结构与算法》实践能力专题训练4:串、数组、广义表
- 2015级计科软件《数据结构与算法》实践能力专题训练6图论
- 数据结构与算法专题之树——树与二叉树的定义与性质
- 数据结构与算法专题之树——平衡二叉树(AVL树)
- 数据结构与算法专题之树——二叉树的遍历及应用
- 【数据结构与算法】二叉树
- 数据结构与算法-二叉树
- 算法与数据结构 - 二叉树
- 数据结构与算法:二叉树
- 数据结构与算法:二叉树
- 数据结构与算法-二叉树
- 数据结构10:二叉树专题
- 【暑假专题训练#数据结构】
- 数据结构实践——二叉树算法库
- 数据结构实践—— 二叉树遍历的递归算法
- [数据结构与算法]二叉树与二叉树遍历
- 数据结构与算法(C#实现)---二叉树
- Mapreduce算法三、利用cleanup对reduce结果进行排序
- okHttp基础分析
- 记号的认识、公式的理解
- BlockingQueue深入分析
- 【线性结构学习3】单链表的储存结构,以及插入删除操作
- 山东理工大学 2015级计科、软件《数据结构与算法》实践能力专题训练5:二叉树
- C#语法小知识(十五)异常处理
- 链式栈
- postgresql jdbc命令转换
- 第九周项目2-对称矩阵压缩存储的实现与应用
- python脚本中如何设置系统的环境变量
- Html5新功能基础简介
- cvSmooth函数 和 OpenCV自带的人脸检测
- hdu 3949 XOR