时间限制:3秒
空间限制:32768K
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
给定二叉树的根节点root,请返回所求距离。
强调一点:我就是被卡在这很久的:不是所有节点中的最大最小值,而是叶子节点。
简单的方法是:对每一个叶子节点进行二进制编码,因为同宗的叶子节点左边会是一样的。
我的方法是先遍历找出最大最小值,然后找出两条路径,接着从根节点开始比较,当不相同时开始计数。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Tree {
public:
void dfsList(vector<int> lists,const int max,const int min,const TreeNode* root,vector<int> &minlist,vector<int> &maxlist){
if(root->val==max||root->val==min){
if(root->val==max){
lists.push_back(root->val);
haha(maxlist,lists);
}
if(root->val==min){
lists.push_back(root->val);
haha(minlist,lists);
}
}
else
lists.push_back(root->val);
if(root->left!=NULL)
dfsList(lists,max,min,root->left,minlist,maxlist);
if(root->right!=NULL)
dfsList(lists,max,min,root->right,minlist,maxlist);
}
void haha(vector<int> &maxlist,vector<int> &lists){
for(int i=0;i<lists.size();i++){
maxlist.push_back(lists[i]);
}
}
void dfs(int &max,int &min,const TreeNode* root){
if(root->right==NULL&&root->left==NULL){
if(root->val>max)
max=root->val;
if(root->val<min)
min=root->val;
return;
}
if(root->left!=NULL)
dfs(max,min,root->left);
if(root->right!=NULL)
dfs(max,min,root->right);
}
int getDis(TreeNode* root) {
// write code here
vector<int> minlist,maxlist;
int max=root->val,min=root->val;
dfs(max,min,root);
//cout<<max<<" "<<min<<endl;
vector<int> lists;
dfsList(lists,max,min,root,minlist,maxlist);
int a=maxlist.size(),b=minlist.size();
//return a;
int tem=a<b?a:b;
//cout<<a<<" "<<b<<endl;
for(int i=0;i<tem;i++){
if(maxlist[i]==minlist[i])
continue;
else
return a+b-i*2;
}
int p=a<b?b:a;
p-=tem;
return p;
}
};