您的位置:首页 > 其它

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

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

实验效果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: