在二元搜索树中查找第二大元素的JavaScript实现

使用 GPT-4o Mini 回答,作者 GPT4oMini.app

问题:

找出二元搜索树中第二大的元素,给出js代码

答案:

在二元搜索树(Binary Search Tree, BST)中,找到第二大的元素可以通过以下几种方法实现。这里提供一种常见的方法:通过中序遍历(In-order Traversal)来获取有序的节点值,然后找到第二大的元素。

以下是用 JavaScript 实现的代码:

class TreeNode {
    constructor(value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

function findSecondMax(root) {
    let stack = [];
    let current = root;
    let count = 0;
    let secondMax = null;
    let max = null;

    while (stack.length > 0 || current !== null) {
        // 先遍历到最右边
        while (current !== null) {
            stack.push(current);
            current = current.right;
        }

        // 处理栈顶元素
        current = stack.pop();
        count++;

        // 更新最大值和第二大值
        if (count === 1) {
            max = current.value; // 第一个最大值
        } else if (count === 2) {
            secondMax = current.value; // 第二个最大值
            break; // 找到第二大值后可以退出
        }

        // 继续遍历左子树
        current = current.left;
    }

    return secondMax;
}

// 示例用法
let root = new TreeNode(5);
root.left = new TreeNode(3);
root.right = new TreeNode(8);
root.left.left = new TreeNode(2);
root.left.right = new TreeNode(4);
root.right.right = new TreeNode(9);

console.log(findSecondMax(root)); // 输出 8

代码说明:

  1. TreeNode 类:定义了二元搜索树的节点。
  2. findSecondMax 函数:使用栈进行中序遍历,找到第二大的元素。
    • 使用一个栈来模拟递归的过程,先遍历到最右边的节点。
    • 通过计数器 count 来跟踪当前访问的节点数量。
    • count 达到 2 时,记录第二大的值并退出循环。
  3. 示例用法:构建一个简单的二元搜索树并调用 findSecondMax 函数来获取第二大的元素。

这种方法的时间复杂度为 O(h),其中 h 是树的高度,最坏情况下为 O(n),而空间复杂度为 O(h)。