博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用JS去实现一个BST(二叉查找树)
阅读量:5945 次
发布时间:2019-06-19

本文共 4281 字,大约阅读时间需要 14 分钟。

BST(二叉查找树)

树的概念

  • 根节点:没有父节点
  • 节点:有父节点和子节点
  • 深度:当前节点的祖先节点数量
  • 高度:所有节点深度最大值
  • 子树:由节点和它后代节点组成
  • 二叉树:节点只能有两个子节点
    • 左节点(比父节点小)
    • 右节点(比父节点大或等于)
    • 中序遍历:左节点-节点-右节点(用于排序)
    • 先序遍历:节点-左节点-右节点(用于打印结构化文档)
    • 后续遍历:左节点-右节点-节点
function BinarySearchTree() {    var Node = function (key) {        this.key = key;        this.left = null;        this.right = null;    }    // 根节点    var root = null;    this.show = () => {        console.log('root=', root);    }    // 插入    this.insert = key => {        let newNode = new Node(key);        if (root == null) {            root = newNode;        } else {            insertNode(root, newNode)        }    }    let insertNode = (node, newNode) => {        if (newNode.key < node.key) {            if (node.left == null) {                node.left = newNode;            } else {                insertNode(node.left, newNode);            }        } else {            if (node.right == null) {                node.right = newNode;            } else {                insertNode(node.right, newNode);            }        }    }    // 搜索    this.search = key => { searchNode(root, key) }    let searchNode = (node, key) => {        if (node == null) {            return false;        }        if (key < node.key) {            searchNode(node.left, key)        } else if (key > node.key) {            searchNode(node.right, key)        } else {            return true;        }    }    // 删除    this.remove = key => { root = removeNode(root, key) }    let removeNode = (node, key) => {        if (node == null) {            return null;        }        if (key < node.key) {            node.left = removeNode(node.left, key);        } else if (key > node.key) {            node.right = removeNode(node.right, key);        } else {            // 没有左右子节点的情况            if (node.left == null && node.right == null) {                node = null;                return node;            }            // 只有一个子节点(如只有左节点或只有右节点)            if (node.left == null && node.right !== null) {                node = node.right;                return node;            } else if (node.right == null && node.left !== null) {                node = node.left;                return node;            }            // 两个子节点的节点(左右节点都存在)            if (node.left && node.right) {                // 找到该节点右侧的最小节点,替换当前节点                let findRightMin = (node) => {                    while (node && node.left !== null) {                        node = node.left;                    }                    return node;                }                // 用右侧最小节点去替换当前节点                var aux = findMinNode(node.right);                node.key = aux.key;                node.right = removeNode(node.right, aux.key);                // 同事需要删除右侧最小节点                return node;            }        }    }    // 中序遍历    this.inOrder = () => {        inOrderNode(root, (nodeKey) => { console.log(nodeKey) })    }    let inOrderNode = (node, callback) => {        if (node !== null) {            inOrderNode(node.left, callback);            callback(node.key);            inOrderNode(node.right, callback);        }    }    // 前序遍历    this.preOrder = () => { preOrderNode(root, (nodeKey) => { console.log(nodeKey) }) }    let preOrderNode = (node, callback) => {        if (node !== null) {            callback(node.key);            preOrderNode(node.left, callback);            preOrderNode(node.right, callback);        }    }    // 后序遍历    this.postOrder = () => { postOrderNode(root, (nodeKey) => { console.log(nodeKey) }) }    let postOrderNode = (node, callback) => {        if (node !== null) {            postOrderNode(node.left, callback);            postOrderNode(node.right, callback);            callback(node.key);        }    }    // 树的最小值    this.min = () => { return minNode(root) }    let minNode = (node) => {        if (node) {            while (node && node.left !== null) {                node = node.left;            }            return node.key;        }        return null;    }    // 树的最大值    this.max = () => { return maxNode(root) }    let maxNode = (node) => {        if (node) {            while (node && node.right !== null) {                node = node.right;            }            return node.key;        }        return null;    }}复制代码

转载于:https://juejin.im/post/5cb94641f265da039955d7b6

你可能感兴趣的文章
Android新权限机制 AppOps
查看>>
“蓝桥杯”软件大赛入门训练4道题
查看>>
Unable to get the CMake version located at
查看>>
爬虫基本原理
查看>>
Heritage from father
查看>>
css选择器
查看>>
使用多线程
查看>>
Django--Uploaded Files以及Handlers
查看>>
在IIS(64位)上部署WCF服务访问Oracle数据库
查看>>
个人在 laravel 开发中使用到的一些技巧(持续更新)
查看>>
iOS之KVO
查看>>
数组的代替品
查看>>
BZOJ-1878: [SDOI2009]HH的项链(莫队算法)
查看>>
Python3 定时访问网页
查看>>
两种算法解决查找子串的问题:hdu1711
查看>>
老板,让我们专注的工作【写给老板的一封信】
查看>>
LBS突围:从微信到微博
查看>>
SFB 项目经验-40-Skype for Business-呼入正常-呼出不正常
查看>>
吴忌寒江卓尔批“闪电网络”背后,是链圈和矿圈的的利益之争
查看>>
python的cls,self,classmethod,staticmethod
查看>>