获取最长单色子路径的长度
2016-04-23 16:13
281 查看
题目:对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。你需要找到这棵树上最长的单色路径。
实验效果如下所示:
#include<iostream> #include<vector> using namespace std; typedef struct BiNode //定义一棵二叉树 { char val;//偶数表示白色,奇数表示黑色 struct BiNode *left; struct BiNode *right; }BiNode,*BiTree; void CreateBiTree(BiTree &T)//创建一颗二叉树 { char c; cin >> c; if ('#' == c) T=NULL; else { T = (BiNode*) malloc(sizeof(BiNode)); T->val = c; CreateBiTree(T->left); CreateBiTree(T->right); } } int Maxlength(vector<int>& vec)//获取某一条路径中的最长单色子路径长度 { if (vec.size() == 0) return 0; int length = 1, max = 1; for (size_t i = 1; i != vec.size(); ++i) { if (vec[i] != vec[i - 1]) { length = 1; } else { length++; if (max < length) { max = length; } } } return max; } void AllPath(BiNode* root, vector<char>& VC,vector<int>& V, vector<int>& Length)//遍历整棵树的所有路径,并保存每一条路径的最长单色子路径的长度到vector中 { if (root == NULL) return; VC.push_back(root->val); int a = (root->val - '0') % 2;//将字符型的数值转换成0(白)和1(黑)来表示结点的黑白属性 V.push_back(a); if (root->left == NULL&&root->right == NULL) { Length.push_back(Maxlength(V)); for (size_t i = 0; i != V.size(); ++i) { cout << VC[i] << " "; } cout << endl; } if (root->left != NULL) AllPath(root->left, VC,V, Length); if (root->right != NULL) AllPath(root->right, VC,V, Length); V.pop_back(); VC.pop_back(); } int GetLongestLength(vector<int>& v)//根据所有路径中的最长单色子路径长度获取这棵树的最长单色子路径 { if (v.size() == 0) return 0; int max = v[0]; for (size_t i = 1; i != v.size(); ++i) { if (v[i]>max) max = v[i]; } return max; } int main() { BiTree T; CreateBiTree(T); vector<int> V;//存储每一条路径的结点的颜色 vector<int> Length;//存储每一条路径的最长单色子树长度 vector<char> VC;//存储每一条路径的结点值 AllPath(T, VC,V, Length); cout << "最长单色子路径的长度是:"; cout<<GetLongestLength(Length) << endl; system("pause"); return 0; }
实验效果如下所示:
相关文章推荐
- Android基础:Android权限
- Object-C 和 lua的相互调用
- hadoop学习序曲之java基础篇--java集合类
- 修改Ubuntu中locale转中文为英文
- mysql 5.6在线DDL建索引测试
- android之AlertDialog 点击其它区域自己主动消失
- 顺序存储结构与链式存储结构的比较(也可以说的顺序表与链表的比较)
- 照片EXIF信息库EXIV2(c++)
- 学会用脚本来刷刷票
- 指针数组和数组指针的区别
- php5.4之pdo连接sqlserver
- 8项目1
- 关于Java中线程池的解读
- fragmentManager Androird对Fragemt的管理
- Shiro整合SSH开发4:Realm授权,perms过滤器测试和使用方法讲述
- 用C/C++实现对STORM的执行信息查看和控制
- js复杂数据格式提交
- 算法导论(2)快速排序
- 每天一个linux命令(13):less命令
- Java开发之常量池概念