[编程题] 二叉树

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


二叉树是一种常见的数据结构,它由一组节点组成,每个节点包含一个值和指向左右子节点的指针。在提供的引用中,我们可以看到一些与二叉树相关的代码和函数。 首先,在引用中,我们可以看到一个定义了二叉树节点的结构体和一些相关函数的头文件。其中,BiTNode是节点的结构体,包含一个整型的数据和指向左右子节点的指针。BiTree是指向二叉树的指针类型。此外,还有一些函数,如BiTreeCreate用于创建二叉树,BiTreeDestroy用于销毁二叉树等。 接下来,在引用中,我们看到一个使用前序遍历数组构建二叉树的函数。这个函数接受一个前序遍历数组a和一个整型指针pi作为参数。函数会根据数组中的元素构建二叉树,其中'#'表示空节点。该函数使用递归的方式构建二叉树,并返回根节点的指针。 最后,在引用中,我们可以看到一个计算二叉树节点个数的函数。该函数接受一个二叉树的根节点指针root和一个整型指针p作为参数。函数会统计二叉树中的节点个数,并将结果保存在p指向的变量中。这个函数也是使用递归的方式实现的,先对当前节点计数,然后递归调用左右子树。 综上所述,二叉树是一种由节点组成的数据结构,可以通过前序遍历数组构建起一棵二叉树,并可以通过递归函数计算二叉树节点个数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [王道数据结构编程题二叉树)](https://blog.csdn.net/qq_43686863/article/details/123334790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构:有关二叉树的必看~经典编程练习基础题(C语言版)](https://blog.csdn.net/qq_56870066/article/details/122908522)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值