获取最长单色子路径的长度

来源:互联网 发布:网络大电影发行 编辑:程序博客网 时间:2024/04/30 16:18

题目:对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。你需要找到这棵树上最长的单色路径。

#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;}   

实验效果如下所示:



0 0