【LeetCode & 剑指offer刷题】树题15:33 判断某序列是否为二叉搜索树的后序序列
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
33 判断某序列是否为二叉搜索树的后序序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。
假设输入的数组的任意两个数字都互不相同。
/*
后序遍历序列规律:最后一个元素为根结点,前面左半部分为左子树,右半部分为右子树
BST规律:对任意结点,左结点<根结点<右结点的
根据这两个规律进行判断
*/
class
Solution
{
public
:
bool
VerifySquenceOfBST
(
vector
<
int
>&
sequence
)
{
if
(
sequence
.
empty
())
return
false
;
return
verify
(
sequence
,
0
,
sequence
.
size
()-
1
);
}
private
:
bool
verify
(
vector
<
int
>&
a
,
int
begin
,
int
end
)
{
if
(
begin
>=
end
)
return
true
;
//只有一个元素了,其没有左右子树,没有判断的必要,故返回true
int root = a[end]; //根结点的值
//计算左子树序列的长度(左子树中结点值均小于根结点值)
int
i
=
begin
;
for
(;
i
<
end
-
1
;
i
++)
//注意这里最多扫描到倒数第二个元素(最后一个元素为根结点)
{
if(a[i] > root) break; //一旦大于根结点就退出
}
//退出时,i即为左子树序列的长度
//判断右子树序列是否满足大于根结点的规律
for
(
int
j
=
i
;
j
<
end
-
1
;
j
++)
{
if(a[j] < root) return false; //若右子树不满足规律,则返回false
}
//判断左子树和右子树是否为二叉搜索树
return
verify
(
a
,
begin
,
i
-
1
)
&&
verify
(
a
,
i
,
end
-
1
);
}
};
相关题目:判断某序列是否为二叉搜索树的前序遍历结果
举一反三:如果要求处理一颗二叉树的遍历序列,
可以先找到二叉树的根结点,再基于根结点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归地处理这两个子序列,如问题“
重建二叉树”