二叉搜索树 js

二叉搜索树

又叫做 二叉查找树、 二叉排序树 有以下特点

  • 如果存在左树,左树所有节点的值小于 根节点的值。
  • 如果存在右树,右树所有节点的值大于根节点的值。
  • 任意结点的左、右子树也分别为二叉搜索树
  • 如果共有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值