JS实现二叉排搜索树
创始人
2024-04-16 00:10:27
0

二叉树中的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧子节点。而二叉搜索树又可以简称BST,它是二叉树的一种,但是只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大的值。

首先我们需要创建一个节点类用于存储节点数据以及它的左右子节点:

class Node {constructor(key) {this.key = key;this.left = null;this.right = null;}
}

然后需要创建一个二叉搜索树类,并且实现二叉搜索树的初步构建:

class BinaryTree {constructor() {this.root = null;}// 插入insert(key) {const newNode = new Node(key);if (this.root === null) {this.root = newNode;}this.inertNode(this.root, newNode);}inertNode(node, newNode) {// 判断是放在左边还是右边// 如果插入的节点的值小于节点值则进入左子树if (newNode.key < node.key) {// 直到左子树为空if (node.left === null) {node.left = newNode;}// 如果没到左子树的底部else {this.inertNode(node.left, newNode);}}// 如果插入的节点的值大于节点值则进入右子树else if (newNode.key > node.key) {if (node.right === null) {node.right = newNode;} else {this.inertNode(node.right, newNode);}}}
}

上面就可以实现二叉搜索树的初步构建了。接下来来了解一下树的遍历,直接看几个例子就可以理解了。

中序遍历例子: 

 先序遍历例子:后序遍历例子:

 直接上完整代码:

class Node {constructor(key) {this.key = key;this.left = null;this.right = null;}
}
class BinaryTree {constructor() {this.root = null;}// 插入insert(key) {const newNode = new Node(key);if (this.root === null) {this.root = newNode;}this.inertNode(this.root, newNode);}inertNode(node, newNode) {// 判断是放在左边还是右边// 如果插入的节点的值小于节点值则进入左子树if (newNode.key < node.key) {// 直到左子树为空if (node.left === null) {node.left = newNode;}// 如果没到左子树的底部else {this.inertNode(node.left, newNode);}}// 如果插入的节点的值大于节点值则进入右子树else if (newNode.key > node.key) {if (node.right === null) {node.right = newNode;} else {this.inertNode(node.right, newNode);}}}// 中序遍历middleorder() {let info = [];this.middleorderNode(this.root, ({ key }) => {info.push(key);})return info;}middleorderNode(node, callback) {if (node) {this.middleorderNode(node.left, callback);callback(node);this.middleorderNode(node.right, callback);}}// 先序遍历preorder() {let info = [];this.preorderNode(this.root, ({ key }) => {info.push(key);})return info;}preorderNode(node, callback) {if (node) {callback(node);this.preorderNode(node.left, callback);this.preorderNode(node.right, callback);}}// 后序遍历afterorder() {let info = [];this.afterorderNode(this.root, ({ key }) => {info.push(key);})return info;}afterorderNode(node, callback) {if (node) {this.afterorderNode(node.left, callback);this.afterorderNode(node.right, callback);callback(node);}}
}
// 初始化一颗二叉排序树
const binerytree = new BinaryTree();
// key值
const keys = [19, 8, 15, 24, 45, 12, 5];
// 生成二叉排序树
keys.forEach(key => binerytree.insert(key));
console.log('先序遍历结果:\n');
console.log(binerytree.preorder());
console.log('中序遍历结果:\n');
console.log(binerytree.middleorder());
console.log('后序遍历结果:\n');
console.log(binerytree.afterorder());

输出结果:

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...