二叉搜索树的后序遍历序列
来源:互联网 发布:八爪鱼头部按摩器 知乎 编辑:程序博客网 时间:2024/06/07 11:38
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
参考代码(不够精简,只为理清思路):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class
Solution {
public
:
bool
VerifySquenceOfBST(vector<
int
> sequence) {
vector<
int
> leftTree,rightTree;
int
root;
// 根结点
if
(sequence.empty())
return
false
;
int
index = 0;
// 标记左右子树界限
int
len = sequence.size();
root = sequence[len-1];
int
i=0;
for
(;i<len-1;++i)
{
if
(sequence[i]>root)
break
;
// 找到第一个大于根结点的位置,则左边为左子树,右边为右子树
}
for
(
int
j=i;j<len-1;++j)
// 循环时去除root,因此为len-1
{
if
(sequence[j]<root)
return
false
;
// 有一个小于root,则返回false
}
if
(i!=0)
{
// 即有左子树
for
(
int
m=0;m<i;++m)
{
leftTree.push_back(sequence[m]);
}
}
if
(i!=len-2)
{
for
(
int
j=i;j<len-1;++j)
{
rightTree.push_back(sequence[j]);
}
}
bool
left =
true
,right =
true
;
// 看左右子树是否是二叉搜索树
if
(leftTree.size()>1) VerifySquenceOfBST(leftTree);
if
(rightTree.size()>1) VerifySquenceOfBST(rightTree);
return
(left&&right);
}
};
0 0
- 二叉树------二叉搜索树的后序遍历序列
- 【树5】二叉搜索树的后序遍历序列
- 题目10:二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 题目1367:二叉搜索树的后序遍历序列
- 1367:二叉搜索树的后序遍历序列 @jobdu
- 二叉搜索树的后序遍历序列
- Q24:二叉搜索树的后序遍历序列
- 剑指offer:二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 题目1367:二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- CSS3绘制四个角不同半径的圆角边框
- 【数据结构与算法分析】《算法竞赛入门经典》第一章 示例及答案
- request.getParameter() 和request.getAttribute() 区别
- Oracle数据库如何打补丁
- 数据库SQL优化大总结之 百万级数据库优化方案
- 二叉搜索树的后序遍历序列
- SSH框架总结
- 算法之——上台阶
- HDU-5695 Gym Class(拓扑排序)
- [读书笔记]
- poj 3641 快速幂
- 嵌套全选jq代码
- 屏幕适配
- 二叉树中和为某一值的路径