WestWorldRanger 2018-11-16 04:39 采纳率: 0%
浏览 457

求解一个算法问题,用二叉树求数组的子数组中最大值

图片说明

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-11-16 16:57
    关注
    // Q713525.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    
    #include <iostream>
    using namespace std;
    
    void print(void * a);
    int cmp(void * a, void * b);
    int getkey(void * a);
    
    // 代码参考了 https://blog.csdn.net/weixin_35909255/article/details/55001177
    
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    
    template<class T>
    class sortBinTree;
    
    template<class T>
    class sortBinTreeNode
    {
        friend class sortBinTree<T>;
    //private:
    public:
        sortBinTreeNode<T> *left;
        sortBinTreeNode<T> *right;
        T data;
    public:
        sortBinTreeNode():left(NULL),right(NULL){}
        sortBinTreeNode(T d):data(d),left(NULL),right(NULL){}
        T getData(){return data;}
    };
    template<class T>
    class sortBinTree
    {
    public:
        sortBinTreeNode<T> *root;
    public:
        sortBinTree(sortBinTreeNode<T> *ptr = NULL):root(ptr){}
    public:
        //注意这个插入函数一定要有返回值,否则相当于没插进去
        int insert_val(T &x){return insert_val(root,x);}
        T max(){return max(root);}
        T min(){return min(root);}
        //这里的sort就相当于中序遍历。因为排序树中序遍历就是从小到大的。
        void sort(){sort(root);}
        int remove(T key){return remove(root,key);}
        sortBinTreeNode<T>* find(T x){return find(root,x);}
    //protected:
    public:
        sortBinTreeNode<T>* find(sortBinTreeNode<T> *t,T key)
        {
            if(t == NULL)
                return NULL;
            else if(getkey(&(t->data)) == getkey(&key))
                return t;
            else if(cmp(&(t->data), &key) > 0)
                return find(t->left,key);
            else
                return find(t->right,key);
        }
        //删除排序树的结点的主要思想:
        //如果要删的这个结点是叶子结点的话就直接删除,
        //否则的话找到其左子树中的最大的那个结点,把它放在要删的那个位置,然后删掉那个左子树中最大的结点
        //或者找到其右子树中的最小的那个结点,把它放在要删的那个位置,然后删掉那个右子树中最小的结点
        int remove(sortBinTreeNode<T> *&t,T key)
        {
            if(t == NULL)
                return FALSE;
            if(key < t->data)
                remove(t->left,key);
            else if(key > t->data)
                remove(t->right,key);
            else
            {
                sortBinTreeNode<T> *p = NULL;
                if(t->left != NULL && t->right != NULL)
                {
                    p = t->left;
                    while(p->right != NULL)
                        p = p->right;
                    t->data = p->data;
                    remove(t->left,p->data);
                }
                else
                {
                    p = t;
                    if(t->left == NULL)
                        t = t->right;
                    else
                        t = t->left;
                    delete p;
                    return TRUE;
                }
            }
        }
        void sort(sortBinTreeNode<T> *p)
        {
            if(p != NULL)
            {
                sort(p->left);
                print(&(p->data));
                sort(p->right);
            }
        }
        T min(sortBinTreeNode<T> *p)//这个传参千万不能传引用,因为这样会改变根节点的指向的。
        {
            if(p != NULL)
            {
                while(p->left != NULL)
                    p = p->left;
                return p->data;
            }
        }
        T max(sortBinTreeNode<T> *p)
        {
            if(p != NULL)
            {
                while(p->right != NULL)
                    p = p->right;
                return p->data;
            }
        }
    
        bool solve(sortBinTreeNode<T> *pN, int p, int q)
        {
            if(pN != NULL)
            {
                if (!solve(pN->right, p, q))
                {
                    if (getkey(&(pN->data)) >= p && getkey(&(pN->data)) <= q)
                    {
                        print(&(pN->data));
                        return true;
                    }
                    else
                        return solve(pN->left, p, q);
                }
                else
                    return true;
            }
            return false;
        }
    
    
        int insert_val(sortBinTreeNode<T> *&p,T &x)
        {//按照小的在左边,大的在右边构造。
            if(p == NULL)
            {
                p = new sortBinTreeNode<T>(x);
                //assert(p != NULL);
                return OK;
            }
            else if(cmp(&(p->data), &x) > 0)
            {
                insert_val(p->left,x);
            }
            else if(cmp(&(p->data), &x) < 0)
            {
                insert_val(p->right,x);
            }
            else 
                return ERROR;
        }
    };
    
    struct Emp
    {
        int NO;
        int Salary;
    };
    
    int cmp(void * a, void * b)
    {
        return ((Emp *)a)->Salary - ((Emp *)b)->Salary;
    }
    
    int getkey(void * a)
    {
        return ((Emp *)a)->NO;
    }
    
    void print(void * a)
    {
        cout << " {no=" << ((Emp *)a)->NO << ", salary=" << ((Emp *)a)->Salary << "} ";
    }
    
    int main()
    {
        sortBinTree<Emp> sbt;
        sortBinTreeNode<Emp> *findval;
        int n = 8;
        Emp emp[8];
        for(int i = 0;i<n;i++)
        {
            cout << "emp no" << i << ":";
            emp[i].NO = i;
            cin >> emp[i].Salary;
            sbt.insert_val(emp[i]);
        }
        sbt.sort();
        int p = 3;
        int q = 5;
        cout << "\nresult: ";
        sbt.solve(sbt.root, p, q);
    
    }
    

    图片说明

    如果问题得到解决,请点我回答左上角的采纳,谢谢

    评论

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?