二叉搜索树
又叫做 二叉查找树、 二叉排序树 有以下特点
- 如果存在左树,左树所有节点的值小于 根节点的值。
- 如果存在右树,右树所有节点的值大于根节点的值。
- 任意结点的左、右子树也分别为二叉搜索树
- 如果共有n个元素,那么平均每次操作需要O(logn)的时间。
- 二叉搜索树的中序遍历为 递增序列
查找某个节点
function findNode(root, num) {
if (root === null) {
return null;
} else if (num < root.val) {
return findNode(root.left, num)
} else if (num > root.val){
return findNode(root.right, num)
}else {
return root;
}
}
取最大值
function findMaxNode(root) {
if(root === null){
return null;
}else {
if(root.right == null){
return root;
}else {
return findMaxNode(root.right)
}
}
}
取最小值
function findMinNode(root) {
if(root === null){
return null;
}else {
if(root.left == null){
return root;
}else {
return findMinNode(root.left)
}
}
}
验证二叉搜索树
// 方法一 递归
const helper = (root, lower, upper) => {
if (root === null) return true;
if (root.val <= lower || root.val >= upper) return false;
return helper(root.left, lower, root.val) && helper(root.right, root.val, upper);
}
var isValidBST = function(root) {
return helper(root, -Infinity, Infinity);
};
// 方法二 栈
var isValidBST = function(root) {
let stack = [];
let inorder = -Infinity;
while (stack.length || root !== null) {
while (root !== null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
if (root.val <= inorder) return false;
inorder = root.val;
root = root.right;
}
return true;
};
二叉搜索树的第K大节点
var kthLargest = function (root, k) {
// 中序遍历
let res = dfs(root, k);
return res.reverse()[k - 1];
};
let res = [];
const dfs = (root) => {
if (!root) return;
dfs(root.left);
res.push(root.val);
dfs(root.right)
return res;
}