023二叉搜索树的侯素遍历序列(栈、树)
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。递归运算
由题意可得:
- 后序遍历序列的最后一个元素为二叉树的根节点;
- 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
C++代码实现
C++ clang++3.9
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size()==0) return false;
return isBST(sequence,0,sequence.size()-1);
}
private:
bool isBST(vector<int>& array,int left,int right){
if(left>=right) return true;//空树
int mid=right;
while(mid>left && array[mid-1]>array[right])
--mid;//找到左右分界点,mid为右子树的第一个位置
for(int j=mid-1;j>=left;--j)
if(array[j]>array[right])
return false;
return isBST(array,left,mid-1) && isBST(array,mid,right-1);
}
};
运行时间:3ms
占用内存:480k
python代码实现
python 2.7.3
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
length = len(sequence)
if len(sequence)==0:
return False
if len(sequence) == 1:
return True
root = sequence[-1]
left = 0
while sequence[left] < root:
left += 1
for j in sequence[left:len(sequence)-1]:
if j < root:
return False
return self.VerifySquenceOfBST(sequence[:left]) or self.VerifySquenceOfBST(sequence[left:length-1])
运行时间:26ms
占用内存:5728k