面试题33:二叉搜索树的后序遍历序列
2020-03-20 本文已影响0人
不会编程的程序猿甲
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
这道题目经过实例分析可以得出规律,后序遍历的结果中,最后一个节点是根节点,左子树比根节点小,右子树比根节点大,所以遍历找到子树的分界点,然后判断右子树是否合法,接着进行递归左右子树。具体如下:
代码实现:
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if sequence == None or len(sequence)<=0: #**注意这二者不一样
return False
root = sequence[-1] #根节点
num = 0 #在循环里的i出循环就无意义,因此在此定义
for i in range(len(sequence)-1):
if sequence[i] > root:
break #找到右子树的起点
num+=1
for j in range(num,len(sequence)-1):
if sequence[j] < root:
return False #判断右子树的合理性
#递归左子树
left = True
if (num>0):
self.VerifySquenceOfBST(sequence[:i])
#递归右子树
right = True
if (num<len(sequence)-1):
self.VerifySquenceOfBST(sequence[i:-1])
return left and right
提交结果:
注:
通过该题发现:
1.列表为none和列表的长度为0不一样;
2.for循环中的变量可以被继续赋值或者被运用,但是不能用在另一个非嵌套的for循环里当作遍历条件,否则会出现这个变量在赋值之前就引用的错误!!!