找出二元搜索树中第二大的元素,给出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
count
来跟踪当前访问的节点数量。count
达到 2 时,记录第二大的值并退出循环。findSecondMax
函数来获取第二大的元素。这种方法的时间复杂度为 O(h),其中 h 是树的高度,最坏情况下为 O(n),而空间复杂度为 O(h)。