题目链接:
- 牛客网:二叉搜索树的后序遍历序列
题解:
function VerifySquenceOfBST(sequence)
{
// write code here
// 如果输入序列长度为0,则返回false,因为空树不是二叉搜索树
if (sequence.length === 0) {
return false
}
return sequenceVerity(sequence, 0, sequence.length - 1)
}
// 递归检查子序列是否满足二叉搜索树的性质
function sequenceVerity(sequence, start, end) {
// 如果 start 大于等于 end,说明此子序列只有一个节点或为空,是合法的二叉搜索树序列,返回 true
if (start >= end) {
return true
}
// 找到根节点
let root = sequence[end]
let flag = start
// 使得 sequence[flag] 是右子树的起点
while (flag <= end && sequence[flag] < root) {
flag++
}
// 验证右子树序列的每个节点是否都大于 root,如果有小于 root 的节点,则不满足二叉搜索树的定义,返回 false
for (let i = flag; i < end; i++) {
if (sequence[i] < sequence[end]) {
return false
}
}
// 递归验证左子树和右子树的序列是否符合二叉搜索树的定义
let res1 = sequenceVerity(sequence, start, flag - 1)
let res2 = sequenceVerity(sequence, flag, end - 1)
return res1 && res2
}
总结:
- verifySquenceOfBST(sequence): 这是主函数,用于检查给定序列 sequence 是否是二叉搜索树的后序遍历序列。
- sequenceVerity(sequence, start, end): 这是一个辅助函数,用于递归检查子序列是否满足二叉搜索树的性质。
函数逻辑如下:
- 如果输入序列长度为0,则返回false,因为空树不是二叉搜索树。
- 否则,调用sequenceVerity(sequence, 0, sequence.length - 1),从根节点开始验证整>个序列。
sequenceVerity 函数逻辑:
- 如果 start 大于等于 end,说明此子序列只有一个节点或为空,是合法的二叉搜索树序列,返回 true。
- 在序列中找到根节点 root(即 sequence[end])。
- 找到分界点 flag,使得 sequence[flag] 是右子树的起点,即 sequence[flag] >= root。
- 验证右子树序列的每个节点是否都大于 root,如果有小于 root 的节点,则不满足二叉搜索树的定义,返回 false。
- 递归验证左子树和右子树的序列是否符合二叉搜索树的定义。
- 返回左右子树验证结果的逻辑与(&&)。