最大二叉搜索子树练习

有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.

给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。

求解过程如下:
1、整体过程是二叉树的后序遍历
2、遍历到当前节点记为cur时,先遍历cur的左子树并收集4个信息,分别是左子树上,最大搜索二叉树子树的头结点,节点数,树上最小值和树上的最大值,再遍历cur的右节点也收集上述四个信息
3、根据步骤2收集的信息,判断是否满足第一种情况,也就是是否已cur为头的子树,整体都是搜索二叉树,如果满足就返回cur节点,如果不满足第一种情况,就返回左右子树各自最大的搜素二叉树中,节点数较多的那个树的头结点。
4、可以使用全局变量更新的方式,或者是返回含有四个变量的数组的方式。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class MaxSubtree {
public:
    TreeNode* getMax(TreeNode* root) {
        TreeNode* balahead;
        int max;
        int min;
        bool sata;
        int count;
        recurfind(root,balahead,max,min,sata,count);
        return balahead;

    }

    void recurfind(TreeNode* root,TreeNode *&balahead,int &max,int &min,bool &sata,int &count)
    {

        if(!root)
            {
            balahead=NULL;
            sata=true;
            max=INT_MIN;
            min=INT_MAX;
            count=0;
            return;
        }
       TreeNode *lbalahead;
       TreeNode *rbalahead;
       int lmax,lmin,rmax,rmin,lcount,rcount;
       bool lsata,rsata;

        recurfind(root->left,lbalahead,lmax,lmin,lsata,lcount);
        recurfind(root->right,rbalahead,rmax,rmin,rsata,rcount);
        if(lsata&&rsata&&(root->val>lmax&&root->val<rmin))
            {
                sata=true;
                balahead=root;
                max=(rmax==INT_MIN)?root->val:rmax;
                min=(lmin==INT_MAX)?root->val:lmin;
                count=lcount+rcount+1;
        }
        else
            {
            sata=false;
            balahead=(lcount>rcount)?lbalahead:rbalahead;
            count=(lcount>rcount)?lcount:rcount;
        }

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值