日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

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

二叉搜索樹(shù)的操作

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

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

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

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

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

min:返回樹(shù)中最小的值/鍵

max:返回樹(shù)中最大的值/鍵

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

先序遍歷

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

中序遍歷

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

后序遍歷

①后序遍歷其左子樹(shù)②后序遍歷其右子樹(shù)③訪問(wè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 // 二叉搜索樹(shù)相關(guān)的操作方法 // 向樹(shù)中插入數(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ù)插入數(shù)據(jù) if (node.left === null) { // 1.1.node的左子樹(shù)上沒(méi)有內(nèi)容node.left = newNode } else { // 1.2.node的左子樹(shù)上已經(jīng)有了內(nèi)容this.insertNode(node.left, newNode) } } else { // 2.準(zhǔn)備向右子樹(shù)插入數(shù)據(jù) if (node.right === null) { // 2.1.node的右子樹(shù)上沒(méi)有內(nèi)容node.right = newNode } else { // 2.2.node的右子樹(shù)上有內(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.相同, 說(shuō)明找到了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.開(kāi)始查找節(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, 那么說(shuō)明沒(méi)有找到要?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)的左子樹(shù)賦值給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 // 要從右子樹(shù)開(kāi)始找 // 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) } } /* // 測(cè)試遍歷結(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 */}

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

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品亚洲专区| 亚洲一区二区三区久久久| 91在线成人| 日韩av不卡在线观看| 中文字幕亚洲精品乱码| 国产精品久久久久av电视剧| 韩国一区二区三区视频| 久久精品三级| 国产一区二区三区四区大秀| 国产一区二区三区国产精品| 精品国产欧美| 高清一区二区三区av| 日产午夜精品一线二线三线| 丁香六月综合| 99成人在线视频| 精品在线99| 亚洲美洲欧洲综合国产一区| 蘑菇福利视频一区播放| 日本亚洲视频| 日本午夜精品一区二区三区电影| 日韩在线观看一区二区三区| 亚洲3区在线| 国产精品www.| 日韩欧美国产精品综合嫩v| 久久九九精品| 老牛影视一区二区三区| 日韩av电影一区| 久久精品亚洲一区二区| 久久毛片亚洲| 五月天久久网站| 天堂va蜜桃一区二区三区| 日韩一区二区三免费高清在线观看 | 亚洲综合婷婷| 日韩成人一级| 国产精成人品2018| 桃色一区二区| 视频在线观看91| 久久国际精品| zzzwww在线看片免费| 国产中文一区| 日韩综合小视频| 狠狠久久伊人| 亚洲激情中文在线| 日韩不卡一区二区三区| 久久精品国产成人一区二区三区| 日韩综合精品| 视频一区免费在线观看| 日韩精品乱码av一区二区| 免费一区二区三区在线视频| 日韩av首页| 亚洲网址在线观看| 久久一区亚洲| 自拍日韩欧美| 欧美在线91| 日本欧美国产| 视频精品一区二区| 国产一区调教| 丝瓜av网站精品一区二区| 国产日韩欧美| 99国产精品免费视频观看| 亚洲精品激情| 成人福利视频| 亚洲欧美日韩在线观看a三区| 国产精品一区二区三区av| 久久国产电影| 国产日韩欧美| 黑丝一区二区三区| 国产精品一区二区三区www| 久久蜜桃精品| 欧美一级二级三级视频| 国产在线成人| 麻豆国产精品一区二区三区| aⅴ色国产欧美| 牛牛精品成人免费视频| 亚洲一区欧美二区| 国产成人久久精品一区二区三区| 丝袜美腿高跟呻吟高潮一区| 麻豆成人91精品二区三区| 伊人成人在线视频| 日本久久综合| 日韩中文字幕无砖| 国产真实久久| 老司机精品视频网| 婷婷亚洲成人| 宅男噜噜噜66国产日韩在线观看| 精品午夜视频| 欧美日韩一区二区高清| 亚洲少妇一区| 久久精品不卡| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲午夜天堂| 国产免费av一区二区三区| 亚洲欧美日韩综合国产aⅴ| 国产精品观看| 亚洲一区有码| 亚洲精品极品少妇16p| 日韩免费精品| 亚洲黄色免费看| 日韩不卡手机在线v区| 精品国产a一区二区三区v免费| 鲁大师成人一区二区三区| 久久久精品区| 欧美日韩亚洲国产精品| 久久精品卡一| 麻豆视频一区二区| 日韩中出av| 91久久中文| 四虎8848精品成人免费网站 | 欧美中文一区| 久久精品国产99久久| 丁香婷婷久久| 91成人在线网站| 免费精品视频| 日韩1区在线| 国产精品毛片久久久| 久久亚洲风情| 国产精选在线| 成人精品动漫一区二区三区| 精品精品久久| 成人亚洲一区二区| 久久中文字幕一区二区| 色一区二区三区四区| 亚洲精品裸体| 久久中文字幕av| 久久免费视频66| 青青青国产精品| 在线视频精品| 亚洲一区不卡| 久久男人天堂| 你懂的亚洲视频| 日韩高清电影免费| 久久成人亚洲| 亚洲激情社区| 亚洲高清成人| 韩国精品主播一区二区在线观看| 精品国产午夜肉伦伦影院| 国产欧美日韩在线观看视频| 蜜臀av亚洲一区中文字幕| 国内激情久久| 久久久久久网| 视频小说一区二区| 亚洲黄色中文字幕| 精品国产精品久久一区免费式| 亚洲精品成人一区| 亚洲精品精选| 亚洲精选久久| 亚洲精品高潮| 国产精品一区二区精品| 日本特黄久久久高潮| 日韩三级一区| 日本国产一区| 欧美一级全黄| 欧美一级二级视频| 日韩精品国产精品| 免费一级欧美在线观看视频| 国产精品中文| 成人美女视频| 久久精品国产亚洲夜色av网站| 桃色av一区二区| 人人精品亚洲| 香蕉人人精品| 久久国产精品毛片| 国产亚洲精品美女久久久久久久久久| 日韩和欧美一区二区三区| 日本国产亚洲| 国产伦理一区| 老牛国内精品亚洲成av人片 | 丝袜亚洲精品中文字幕一区| 免费在线成人网| 欧美日韩午夜| 中文另类视频| 99视频一区| 欧美中文日韩| 日韩精品一区二区三区中文在线| 日本a级不卡| 欧美激情视频一区二区三区在线播放| 欧美日韩国产观看视频| 激情偷拍久久| 首页国产欧美久久| 欧美日韩午夜| 国产美女高潮在线观看| 99久久99久久精品国产片果冰| 亚洲午夜视频| 国产欧美日韩视频在线| 国产精品麻豆久久| 欧美91精品| 一区二区高清| 中文字幕av亚洲精品一部二部| 国产欧美日韩视频在线| 亚洲免费福利| 亚洲主播在线| 欧美在线首页| 精品国产免费人成网站| 99亚洲视频| 国产精品一国产精品| 欧美特黄一级大片| 天堂av一区| 成人高清一区| 欧美一级专区| 久久精品国产在热久久|