33 二叉搜索树的后序遍历序列

题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出true,否则输出false。假设输入的数组的任意两个数字都互不相同。
举例:序列{5,7,6,9,11,10,8}是下图二叉搜索树的后序遍历结果。

牛客网 OJ
AcWing OJ

C 语言题解

序列最后一个数字是根节点,序列剩余部分分成两部分,前一部分是左子树,后一部分是右子树。
左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。

bool VerifySquenceOfBST(int sequence[], int length)
{
	if (sequence == nullptr || length <= 0)
		return false;

	int root = sequence[length - 1];

	// 在二叉搜索树中左子树的结点小于根结点
	int i = 0;
	for (; i < length - 1; 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);
}

C++ 题解

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) 
    {
        vector<int> leftTree,rightTree;
        if(sequence.empty()) 
            return false;
        
        int index = 0; // 标记左右子树界限
        int len = sequence.size();
        // 根结点
        int root = sequence[len-1];
        int i=0;
        for(;i<len-1;++i)
        {
            // 找到第一个大于根结点的位置,则左边为左子树,右边为右子树
            if(sequence[i]>root) 
                break; 
        }
        
        // 循环时去除root,因此为len-1
        for(int j=i;j<len-1;++j) 
        {
            // 有一个小于root,则返回false
            if(sequence[j]<root) 
                return false; 
        }
        
        // 如果有左子树
        if(i > 0)
        {            
            for(int m=0;m<i;++m)
            {
                leftTree.push_back(sequence[m]);
            }
        }
        
        // 如果有右子树
        if(i < len-1)
        {
            for(int j=i;j<len-1;++j)
            {
                rightTree.push_back(sequence[j]);
            }
        }
        
        // 看左右子树是否是二叉搜索树
        bool left = true,right = true; 
        if(leftTree.size()>1) 
            left = VerifySquenceOfBST(leftTree);
        
        if(rightTree.size()>1) 
            right = VerifySquenceOfBST(rightTree);
         
        return (left&&right);
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if not sequence:
            return False
        
        root = sequence[-1]
        i = 0
        
        # 把根排除,要不然死循环
        for node in sequence[:-1]:
            if node > root:
                break
            i += 1
        
        # 找到左右子树分界的节点
        for node in sequence[i:-1]:
            if node < root:
                return False
        
        # 分别检验左右子树
        left = True
        if i:
            left = self.VerifySquenceOfBST(sequence[:i])
        
        right = True
        if i < len(sequence) - 1:
            right = self.VerifySquenceOfBST(sequence[i:-1])
        
        return left and right        
posted @ 2019-03-11 08:24  youngliu91  阅读(117)  评论(0)    收藏  举报