【二叉排序树】二叉排序树的后序遍历

大致思路:

思路比较简单粗暴:先找到根节点,然后去遍历序列,找到第一个大于根节点值的元素则为左子树的开头,以此划分开左右子树,递归(二叉树一般都递归!!!!)

要注意的点在于,有可能某个根节点没有左子树和右子树,应该怎么处理; 递归的临界条件有哪些情况(只剩一个结点、只剩两个结点),如何对这些情况进行正确判断。

AC代码:

class Solution {
public:
    
    bool varify(vector<int> s, int start, int end,int root)
    {
        if(start==end+1) //其实只有根节点
            return true;
        if(start==end) //除根节点外就一个元素了
            return s[start]<root;
        if(start+1==end) //就两个元素了
        {
            //两个元素也有可能是三种情况!!!!
            return (s[start]<root&&s[end]>root)||(s[start]<root&&s[end]<root)||(s[start]>root&&s[end]>root);
        }
        
        //找到以此root划分左子树右子树的地方
        int right_begin = 0;
        for(int i=start;i<end;i++)
        {
            if(s[i]>root)
            {
                right_begin = i;
                break;
            }
        }
        
        //如果没有左子树
        if(right_begin==start)
            return varify(s,right_begin,end-1,s[end]);
        //如果没有右子树
        if(right_begin==0)
            return varify(s,start,end-1,s[end]);
        else
        {
            //右子树的元素是不是都大于root
            for(int i=right_begin;i<end;i++)
            {
                if(s[i]<root)
                    return false;
            }
        }

        //递归去看左子树和右子树
        return varify(s,start,right_begin-2,s[right_begin-1])&&varify(s,right_begin,end-1,s[end]);
    }
    
    
    bool VerifySquenceOfBST(vector<int> sequence) 
    {
        if(sequence.size()==0)
            return false;
        return varify(sequence,0,sequence.size()-2,sequence[sequence.size()-1]);
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值