如何使用JavaScript实现二叉搜索树算法

发布时间:2022-02-23 11:33:37 作者:小新
来源:亿速云 阅读:149

这篇文章主要介绍了如何使用JavaScript实现二叉搜索树算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

什么是二叉搜索树 (BST)?

在编码面试中很常见,BST(Binary search tree) 是一种树状数据结构,顶部有一个根。它们是存储数值的好方法,因为它们的有序性质允许快速搜索和查找。

与普通树相比,BST 具有以下特性:

下图应该更清楚地说明事情。

二叉树节点的定义

如何使用JavaScript实现二叉搜索树算法

我们通常在 Javascript 中定义一个二叉树节点,函数如下:

 function TreeNode(val, left, right) {
     this.val = val
     this.left = left
     this.right = right
 }

二叉树基本遍历(中序、后序、前序)

首先要知道如何遍历 BST 的每个节点。这允许我们在 BST 的所有节点上执行一个功能。例如,如果我们想在 BST 中找到一个值,我们就需要节点。

有三种主要方法可以做到这一点。幸运的是,他们有共同的主题。

中序遍历

递归算法是开始使用二叉树中序遍历的最简单方法。思路如下:

Inorder 算法从左、中、右遍历树节点。

/**
* @param {TreeNode} root
*/
const inorder = (root) => {
    const nodes = []
    if (root) {
        inorder(root.left)
        nodes.push(root.val)
        inorder(root.right)
    }
    return nodes
}
// for our example tree, this returns [1,2,3,4,5,6]

后序遍历

递归算法是开始后序遍历的最简单方法。

后序遍历从左、右、中访问树节点。

/**
* @param {TreeNode} root
*/
const postorder = (root) => {
    const nodes = []
    if (root) {
        postorder(root.left)
        postorder(root.right)
        nodes.push(root.val)
    }
    return nodes
}
// for our example tree, this returns [1,3,2,6,5,4]

前序遍历

递归算法是开始前序遍历的最简单方法。

后序遍历从中、左、右访问树节点。

/**
* @param {TreeNode} root
*/
const preorder = (root) => {
    const nodes = []
    if (root) {
        nodes.push(root.val)
        preorder(root.left)
        preorder(root.right)
    }
    return nodes
}
// for our example tree, this returns [4,2,1,3,5,6]

什么是有效的二叉搜索树?

有效的二叉搜索树 (BST) 具有所有值小于父节点的左子节点,以及值大于父节点的所有右子节点。

要验证一棵树是否是有效的二叉搜索树:

/**
* @param {TreeNode} root
*/
const isValidBST = (root) => {
    const helper = (node, min, max) => {
        if (!node) return true
        if (node.val <= min || node.val >= max) return false
        return helper(node.left, min, node.val) && helper(node.right, node.val, max)
    }
    return helper(root, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)
}

如何找到二叉树最大深度

在这里,算法试图找到我们 BST 的高度/深度。换句话说,我们正在查看 BST 包含多少个“级别”。

/**
* @param {TreeNode} root
*/
const maxDepth = function(root) {
    const calc = (node) => {
        if (!node) return 0
        return Math.max(1 + calc(node.left), 1 + calc(node.right))
    }
    return calc(root)
};

如何找到两个树节点之间的最小公共祖先

让我们提高难度。我们如何在我们的二叉树中找到两个树节点之间的共同祖先?让我们看一些例子。

如何使用JavaScript实现二叉搜索树算法

在这棵树中,3和1的最低共同祖先是2。3和2的LCA是2。6和1和6的LCA是4。

看到这里的模式了吗?两个树节点之间的 LCA 要么是节点本身之一(3 和 2 的情况),要么是父节点,其中第一个子节点位于其左子树中的某处,而第二个子节点位于其右子树中的某处。

寻找两个树节点 p 和 q 之间的最低共同祖先(LCA)的算法如下:

/**
* @param {TreeNode} root
* @param {TreeNode} p
* @param {TreeNode} q
*/
const lowestCommonAncestor = function(root, p, q) {
    let lca = null
    const isCommonPath = (node) => {
        if (!node) return false
        var isLeft = isCommonPath(node.left)
        var isRight = isCommonPath(node.right)
        var isMid = node == p || node == q
        if (isMid && isLeft || isMid && isRight || isLeft && isRight) {
            lca = node
        }
        return isLeft || isRight || isMid
    }
    isCommonPath(root)
    return lca
};

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用JavaScript实现二叉搜索树算法”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. JavaScript如何实现递归算法
  2. 使用JavaScript怎么实现一个滤镜算法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript

上一篇:html5怎么设置菜单栏缓慢下拉效果

下一篇:怎么用JavaScript制作猜谜游戏

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》