剑指Offer之 - 二叉搜索树的后续遍历序列

题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。

思路:

根据二叉搜索树的后续遍历结果的特点来判断:序列的最后一个数是根结点,且前面一部分的数 < 最后一个数,根结点之前的后一部分数 > 最后一个数。

类似这样的数组:5,7,6,9,11,10,8

如果满足上面的条件,然后再对两部分进行递归判断,否则直接返回false。

代码1:

#include<iostream>
#include <stack>
#include<queue>
using namespace std;

//功能:判断一个序列是否是一个二叉搜索树的后序遍历序列,如序列:5,7,6,9,11,10,8
//思路:递归,根结点位于最后,前半段< 最后,中间半段> 最后
//注意:递归结束条件,只有一个结点时返回真

bool VerifySquenceOfBST(int sequence[] , int length)
{
	if(sequence == NULL || length <= 0)
		return false;
	if(length == 1)
		return true;
	int root = sequence[length - 1];

	int i = 0 ;
	for( ; i < length ; i++)
	{
		if(sequence[i] > root)
			break;
	}
	int j = i ; 
	for( ; j < length - 1 ; j++)
	{
		if(sequence[j] < root)
			return false;
	}
	bool left = true;
	if(i > 0)
		left = VerifySquenceOfBST(sequence , i);
	bool right = true;
	if(i < length - 1)
		right = VerifySquenceOfBST(sequence + i , length - i - 1);
	return left && right;
}

int main()
{
	int a[] = {5,7,6,9,11,10,8};
	cout<<VerifySquenceOfBST(a , sizeof(a) / sizeof(*a));
	return 0;
}

代码2:

来自http://www.nowcoder.com/books/coding-interviews/a861533d45854474ac791d90e447bafd?rp=1.

class Solution {
public:
	bool VerifySquenceOfBST(vector<int> sequence) {    	
        
        int len = sequence.size();
        if(len == 0)
            return false;
        if(len == 1)
            return true;
        int i = 0;
        for( ; i < len - 1 ; i++){
            if(sequence[i] > sequence[len-1])
                break;
        }
        int j = i;
        for( ; j < len - 1 ; j++){
            if(sequence[j] < sequence[len-1])
                return false;
        }
        vector<int>::iterator iter = sequence.begin() ;
        bool left = true;
        //如果i==0,则左子树为空,此时不需要判断左子树
        if(i > 0)        
        {
            vector<int> pre(iter , iter + i);
        	left = VerifySquenceOfBST(pre);
        }
        bool right = true;
        //如果i==len-1,则右子树为空,不再需要判断右子树
       	if(i < len - 1)
        {
            vector<int> post(iter + i , iter + len - 1);
        	right = VerifySquenceOfBST(post);
        }
        return left && right;
        
	
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值