# 题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
提示:
- 数组长度 <= 1000
- 参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
1
2
3
4
5
2
3
4
5
# 测试用例
用例1 ;
- 输入:
[1,6,3,2,5]
- 输出:
false
用例2
- 输入:
[1,3,2,6,5]
- 输出:
true
# 思路
递归
二叉搜索树特点如下
- 若任意结点的左子树不为空,则该结点左子树上所有节点的值都不大于其根节点的值
- 若任意结点的右子树不为空,则该结点右子树上所有节点的值都不小于其根节点的值
思路就是递归判断左子树是否都不大于root
同时右子树是否都大于root
,每次要先拿到根节点,根据根节点来拿到左子树和右子树,然后进行判断
# 代码实现
/**
* @param {number[]} postorder
* @return {boolean}
*/
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入后序遍历序列: ");
const postorder = readline().split(" ").map(Number);
var verifyPostorder = function (postorder) {
// 后序遍历
// 二叉搜索树特点如下
// 1. 若任意结点的左子树不为空,则该结点左子树上所有节点的值都不大于其根节点的值
// 2. 若任意结点的右子树不为空,则该结点右子树上所有节点的值都不小于其根节点的值
// 思路就是判断左子树是否都不大于root同时右子树是否都大于root
if (postorder.length <= 2) {
return true;
}
// 拿到根节点
const root = postorder.pop();
let i = 0;
// 首先找到左右子树的分界点
while (postorder[i] < root) {
i++;
}
// 拿到右子树
let rightTree = postorder.slice(i);
// 右子树当中所有节点都应该大于root
const rightRes = rightTree.every((item) => item > root);
// 递归判断左右子树
return (
rightRes &&
verifyPostorder(postorder.slice(0, i)) &&
verifyPostorder(rightTree)
);
};
const res = verifyPostorder(postorder);
console.log("结果为: ", res);
/*
请输入后序遍历序列:
1 6 3 2 5
结果为: false
请输入后序遍历序列:
1 3 2 6 5
结果为: true
*/
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57