[编程题] 二叉树

时间限制: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;
    }
};
点赞