您的位置:首页 > 其它

20、二叉搜索树的后续遍历序列

2018-03-28 10:09 190 查看

题目:

输入一个整数数组,判断该数组是否为某二叉树的后续遍历结果,如果是输出true,否为false。假设输入中任意两个数字都不相同。例如 5,7,6,9,11,10,8 可以为一个后续遍历结果。其中5,7,6,为左子树,9,11,10为右子树,8为根

解法:

1、二叉搜索树后续遍历序列:(左)(右)根,且左<根<右。序列中的数字大小关系如左边所示。
2、利用循环法。
3、利用递归法。
(一)循环代码如下:
    从后向前依次确认 每一个点是否满足 二叉搜索树在后续遍历中的大小关系。
    例如题目案例中,第一次8为根,5,7,6为左数,9,11,10为右树,满足情况。
    第二次循环中,根为10.即右子树的根。右子树的根>根>左子树。所以5,7,6仍然满足。又在右子树中存在(左=9)<(根=10)<(右=11) 的情况,且数字9紧跟在5,7,6后面。所以该逻辑正确。  每一次循环结束后,让i归零。 bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()||sequence.size()==0)
return false;
int i=0;
int n =sequence.size();
while(--n)
{
while(sequence[i]<sequence
) i++;
while(sequence[i]>sequence
) i++;
if(n!=i)
return false;
else
i=0;
}
return true;(二)递归代码如下:
1、先确认左子树所有点小于根节点
2、再确认右子树所有点大于根节点
3、依次求得左右子树进行递归 bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()||sequence.size()==0)
return false;
int i=0,j;
int n =sequence.size();
int root = sequence[n-1];
for(;i<n-1;i++)
{
if(sequence[i]>root)
break;
}
for(j=i;j<n-1;j++)
{
if(sequence[j]<root)
return false;
}
vector<int> left,right;
for(j=0;j<i;j++)
left.push_back(sequence[j]);
for(j=i;j<n-1;j++)
right.push_back(sequence[j]);
bool l=true,r=true;//注意此处要 初始化为true,因为如果下面两个if没有进行,即子树为空树。相当于只有根节点,肯定为true。
if(left.size()>1) l=VerifySquenceOfBST(left);// 因为要运行此处的代码,在第一层递归中就已经判断整棵树不为空了。
if(right.size()>1) r=VerifySquenceOfBST(right);//也即仅在第一层递归中设置空树为false,其他层递归都是true
return l&&r;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C