题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
后序遍历,顾名思义根节点位于尾部,故可将一个序列分为左子树序列、右子树序列和根节点,对于两个子序列又可分别验证是否是二搜索叉树的后序序列,即此问题是一个递归问题。递归的出口是系列中仅包含一个元素。
C++代码实现
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int size = sequence.size(); if(size ==0){ return false; } return VerifyPostOfBST( sequence,0,size-1); } bool VerifyPostOfBST(vector<int> sequence,int start,int end){ if(start==end){ return true; } int root=sequence[end]; int mid=end; for(int i=start ; i<end ; i++){ if(sequence[i]>=sequence[end]){ mid=i; break; } } bool curr=true; //根节点没有左子树或右子树的情况 bool v1=true,v2=true; if(mid==start){ for(int i= mid; i<end;i++){ curr = curr && sequence[i]>=sequence[end]; } v2=VerifyPostOfBST(sequence,mid,end-1); }else if(mid==end){ for(int i= start; i<mid;i++){ curr = curr && sequence[i]<=sequence[end]; } v1=VerifyPostOfBST(sequence,start,mid-1); }else { for(int i= mid; i<end;i++){ curr = curr && sequence[i]>=sequence[end]; } for(int i= start; i<mid;i++){ curr = curr && sequence[i]<=sequence[end]; } v1=VerifyPostOfBST(sequence,start,mid-1); v2=VerifyPostOfBST(sequence,mid,end-1); } return v1 && v2 && curr; } };
原文地址:https://www.cnblogs.com/fancy-li/p/11625412.html
时间: 2024-10-06 20:41:33