一种求二叉树直径的方法

上周的今天被一道涉及二叉树直径的题卡住了(当时还用并查集试了半天),今天突然很精神,就写了这种方法(辉夜2开播了!!)
思路非常简单
0.计算左侧子节点到根节点最长距离lmax和右侧子节点到根节点最长距离rmax
1.计算所求点到根节点距离d 并判断该节点在左侧(flag=1)还是在右侧(flag=0)
2.输出 d+lmax 或者 d+rmax

#include 

using namespace std;
int tree[100000][2],ftr[100000],lmax,rmax,anx,flag;
void dfs(int x,int step)
{

    if(x!=0){
        anx=max(step,anx);
        dfs(tree[x][1],step+1);
        dfs(tree[x][0],step+1);
    }

}
void rdfs(int x,int step)
{
    if(x!=1){
        anx=max(step,anx);
        rdfs(ftr[x],step+1);
        if(x==tree[1][0])flag=1;
    }

}
void findlmax()
{
    int start=tree[1][0];
    anx=0;
    dfs(start,1);
    lmax=anx;
}
void findrmax()
{
    int start=tree[1][1];
    anx=0;
    dfs(start,1);
    rmax=anx;
}
void get_d(int x)
{
    anx=0;
    rdfs(x,1);
    if(flag)cout<<anx+rmax<<endl;
    else cout<<anx+lmax<<endl;
}

int main()
{
    ios::sync_with_stdio(0);
    int n,s;
    while(cin>>n){
    flag=0;
    for(int i=1;i<=n;i++){cin>>tree[i][0]>>tree[i][1];ftr[tree[i][1]]=i,ftr[tree[i][0]]=i;}
    cin>>s;
    findlmax();
    findrmax();
    get_d(s);
}
}

你可能感兴趣的:(interesting,technique)