电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript實(shí)現(xiàn)二叉搜索樹

瀏覽:116日期:2023-06-07 14:49:19

JavaScript中的搜索二叉樹實(shí)現(xiàn),供大家參考,具體內(nèi)容如下

二叉搜索樹(BST,Binary Search Tree),也稱二叉排序樹或二叉查找樹

二叉搜索樹是一顆二叉樹, 可以為空;如果不為空,滿足以下性質(zhì):

非空左子樹的所有鍵值小于其根結(jié)點(diǎn)的鍵值 非空右子樹的所有鍵值大于其根結(jié)點(diǎn)的鍵值 也就是左結(jié)點(diǎn)值想<根結(jié)點(diǎn)值<右節(jié)點(diǎn)值 左、右子樹本身也都是二叉搜索樹

二叉搜索樹的操作

insert(key):向樹中插入一個(gè)新的鍵

search(key):在樹中查找一個(gè)鍵,如果結(jié)點(diǎn)存在,則返回true;如果不存在,則返回false

inOrderTraverse:通過中序遍歷方式遍歷所有結(jié)點(diǎn)

preOrderTraverse:通過先序遍歷方式遍歷所有結(jié)點(diǎn)

postOrderTraverse:通過后序遍歷方式遍歷所有結(jié)點(diǎn)

min:返回樹中最小的值/鍵

max:返回樹中最大的值/鍵

remove(key):從樹中移除某個(gè)鍵

先序遍歷

①訪問根結(jié)點(diǎn) ②先序遍歷其左子樹 ③先序遍歷其右子樹

中序遍歷

①中序遍歷其左子樹②訪問根結(jié)點(diǎn)③中序遍歷其右子樹

后序遍歷

①后序遍歷其左子樹②后序遍歷其右子樹③訪問根結(jié)點(diǎn)

JavaScript 代碼實(shí)現(xiàn)隊(duì)列結(jié)構(gòu)

// 創(chuàng)建BinarySearchTreefunction BinarySerachTree() { // 創(chuàng)建節(jié)點(diǎn)構(gòu)造函數(shù) function Node(key) { this.key = key this.left = null this.right = null } // 保存根的屬性 this.root = null // 二叉搜索樹相關(guān)的操作方法 // 向樹中插入數(shù)據(jù) BinarySerachTree.prototype.insert = function (key) { // 1.根據(jù)key創(chuàng)建對(duì)應(yīng)的node var newNode = new Node(key) // 2.判斷根節(jié)點(diǎn)是否有值 if (this.root === null) { this.root = newNode } else { this.insertNode(this.root, newNode) } } BinarySerachTree.prototype.insertNode = function (node, newNode) { if (newNode.key < node.key) { // 1.準(zhǔn)備向左子樹插入數(shù)據(jù) if (node.left === null) { // 1.1.node的左子樹上沒有內(nèi)容node.left = newNode } else { // 1.2.node的左子樹上已經(jīng)有了內(nèi)容this.insertNode(node.left, newNode) } } else { // 2.準(zhǔn)備向右子樹插入數(shù)據(jù) if (node.right === null) { // 2.1.node的右子樹上沒有內(nèi)容node.right = newNode } else { // 2.2.node的右子樹上有內(nèi)容this.insertNode(node.right, newNode) } } } // 獲取最大值和最小值 BinarySerachTree.prototype.min = function () { var node = this.root while (node.left !== null) { node = node.left } return node.key } BinarySerachTree.prototype.max = function () { var node = this.root while (node.right !== null) { node = node.right } return node.key } // 搜搜特定的值 /* BinarySerachTree.prototype.search = function (key) { return this.searchNode(this.root, key) } BinarySerachTree.prototype.searchNode = function (node, key) { // 1.如果傳入的node為null那么, 那么就退出遞歸 if (node === null) { return false } // 2.判斷node節(jié)點(diǎn)的值和傳入的key大小 if (node.key > key) { // 2.1.傳入的key較小, 向左邊繼續(xù)查找 return this.searchNode(node.left, key) } else if (node.key < key) { // 2.2.傳入的key較大, 向右邊繼續(xù)查找 return this.searchNode(node.right, key) } else { // 2.3.相同, 說明找到了key return true } } */ BinarySerachTree.prototype.search = function (key) { var node = this.root while (node !== null) { if (node.key > key) {node = node.left } else if (node.key < key) {node = node.right } else {return true } } return false } // 刪除節(jié)點(diǎn) BinarySerachTree.prototype.remove = function (key) { // 1.獲取當(dāng)前的node var node = this.root var parent = null // 2.循環(huán)遍歷node while (node) { if (node.key > key) {parent = nodenode = node.left } else if (node.key < key) {parent = nodenode = node.right } else {if (node.left == null && node.right == null) {} } } } BinarySerachTree.prototype.removeNode = function (node, key) { // 1.如果傳入的node為null, 直接退出遞歸. if (node === null) return null // 2.判斷key和對(duì)應(yīng)node.key的大小 if (node.key > key) { node.left = this.removeNode(node.left, key) } } // 刪除結(jié)點(diǎn) BinarySerachTree.prototype.remove = function (key) { // 1.定義臨時(shí)保存的變量 var current = this.root var parent = this.root var isLeftChild = true // 2.開始查找節(jié)點(diǎn) while (current.key !== key) { parent = current if (key < current.key) {isLeftChild = truecurrent = current.left } else {isLeftChild = falsecurrent = current.right } // 如果發(fā)現(xiàn)current已經(jīng)指向null, 那么說明沒有找到要?jiǎng)h除的數(shù)據(jù) if (current === null) return false } // 3.刪除的結(jié)點(diǎn)是葉結(jié)點(diǎn) if (current.left === null && current.right === null) { if (current == this.root) {this.root == null } else if (isLeftChild) {parent.left = null } else {parent.right = null } } // 4.刪除有一個(gè)子節(jié)點(diǎn)的節(jié)點(diǎn) else if (current.right === null) { if (current == this.root) {this.root = current.left } else if (isLeftChild) {parent.left = current.left } else {parent.right = current.left } } else if (current.left === null) { if (current == this.root) {this.root = current.right } else if (isLeftChild) {parent.left = current.right } else {parent.right = current.right } } // 5.刪除有兩個(gè)節(jié)點(diǎn)的節(jié)點(diǎn) else { // 1.獲取后繼節(jié)點(diǎn) var successor = this.getSuccessor(current) // 2.判斷是否是根節(jié)點(diǎn) if (current == this.root) {this.root = successor } else if (isLeftChild) {parent.left = successor } else {parent.right = successor } // 3.將刪除節(jié)點(diǎn)的左子樹賦值給successor successor.left = current.left } return true } // 找后繼的方法 BinarySerachTree.prototype.getSuccessor = function (delNode) { // 1.使用變量保存臨時(shí)的節(jié)點(diǎn) var successorParent = delNode var successor = delNode var current = delNode.right // 要從右子樹開始找 // 2.尋找節(jié)點(diǎn) while (current != null) { successorParent = successor successor = current current = current.left } // 3.如果是刪除圖中15的情況, 還需要如下代碼 if (successor != delNode.right) { successorParent.left = successor.right successor.right = delNode.right } } // 遍歷方法 //handler為回調(diào)函數(shù) // 先序遍歷 BinarySerachTree.prototype.preOrderTraversal = function (handler) { this.preOrderTranversalNode(this.root, handler) } BinarySerachTree.prototype.preOrderTranversalNode = function (node, handler) { if (node !== null) { handler(node.key) this.preOrderTranversalNode(node.left, handler) this.preOrderTranversalNode(node.right, handler) } } // 中序遍歷 BinarySerachTree.prototype.inOrderTraversal = function (handler) { this.inOrderTraversalNode(this.root, handler) } BinarySerachTree.prototype.inOrderTraversalNode = function (node, handler) { if (node !== null) { this.inOrderTraversalNode(node.left, handler) handler(node.key) this.inOrderTraversalNode(node.right, handler) } } // 后續(xù)遍歷 BinarySerachTree.prototype.postOrderTraversal = function (handler) { this.postOrderTraversalNode(this.root, handler) } BinarySerachTree.prototype.postOrderTraversalNode = function (node, handler) { if (node !== null) { this.postOrderTraversalNode(node.left, handler) this.postOrderTraversalNode(node.right, handler) handler(node.key) } } /* // 測試遍歷結(jié)果(inOrderTraversal可以替換成別的遍歷方式) resultString = '' bst.inOrderTraversal(function (key) { resultString += key + ' ' }) alert(resultString) // 3 5 6 7 8 9 10 11 12 13 14 15 18 20 25 */}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 长城人品牌官网| 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 至顶网| 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 不锈钢水管-不锈钢燃气管-卫生级不锈钢管件-不锈钢食品级水管-广东双兴新材料集团有限公司 | ZHZ8耐压测试仪-上海胜绪电气有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 有源电力滤波装置-电力有源滤波器-低压穿排电流互感器|安科瑞 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 广州昊至泉水上乐园设备有限公司 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 定制/定做衬衫厂家/公司-衬衫订做/订制价格/费用-北京圣达信 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 复合肥,化肥厂,复合肥批发,化肥代理,复合肥品牌-红四方 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 |