【中等】二叉搜索树的后序遍历序列- 2.28

106 阅读2分钟

题目链接:

题解:

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): 这是一个辅助函数,用于递归检查子序列是否满足二叉搜索树的性质。

函数逻辑如下:

  1. 如果输入序列长度为0,则返回false,因为空树不是二叉搜索树。
  2. 否则,调用sequenceVerity(sequence, 0, sequence.length - 1),从根节点开始验证整>个序列。

sequenceVerity 函数逻辑:

  1. 如果 start 大于等于 end,说明此子序列只有一个节点或为空,是合法的二叉搜索树序列,返回 true。
  2. 在序列中找到根节点 root(即 sequence[end])。
  3. 找到分界点 flag,使得 sequence[flag] 是右子树的起点,即 sequence[flag] >= root。
  4. 验证右子树序列的每个节点是否都大于 root,如果有小于 root 的节点,则不满足二叉搜索树的定义,返回 false。
  5. 递归验证左子树和右子树的序列是否符合二叉搜索树的定义。
  6. 返回左右子树验证结果的逻辑与(&&)。