摘要:概述樹(shù)在前端的重要性就不言而喻了,隨處可見(jiàn),,,,有時(shí)候前后端交互中也會(huì)收到具有遞歸性質(zhì)的結(jié)構(gòu)數(shù)據(jù),需要注意一點(diǎn)的是中雖然出現(xiàn)了和數(shù)據(jù)結(jié)構(gòu),但其實(shí)現(xiàn)和其它語(yǔ)言例如中底層實(shí)現(xiàn)不同,在的中其實(shí)現(xiàn)基于,利用空間換時(shí)間的思想,畢竟查找起來(lái)而紅黑樹(shù)。
概述
樹(shù)在前端的重要性就不言而喻了,隨處可見(jiàn),vdom,dom tree,render tree,有時(shí)候前后端交互中也會(huì)收到具有遞歸性質(zhì)的tree結(jié)構(gòu)數(shù)據(jù),需要注意一點(diǎn)的是es6中雖然出現(xiàn)了set和map數(shù)據(jù)結(jié)構(gòu),但其實(shí)現(xiàn)和其它語(yǔ)言(例如java中)底層實(shí)現(xiàn)不同,在chrome的 v8中其實(shí)現(xiàn)基于hash,利用空間換時(shí)間的思想,畢竟查找起來(lái)hash O(1)而紅黑樹(shù)O(LgN)。但是紅黑樹(shù)作為一種經(jīng)典且重要的數(shù)據(jù)結(jié)構(gòu),綜合優(yōu)勢(shì)比較好,curd操作以及空間消耗在大量數(shù)據(jù)下優(yōu)勢(shì)就體現(xiàn)出來(lái)了。
js實(shí)現(xiàn)const RED = true; const BLACK = false; class Node { constructor(key, value) { this.key = key; this.value = value; this.left = null; this.right = null; this.color = RED; } }
class RBT { constructor() { this.root = null; this.size = 0; } isRed(node) { if (!node) return BLACK; return node.color; } // 左旋 右紅左黑 leftRotate(node) { let tmp = node.right; node.right = tmp.left; tmp.left = node; tmp.color = node.color; node.color = RED; return tmp; } // 右旋轉(zhuǎn) 左紅左子紅 rightRoate(node) { let tmp = node.left; node.left = tmp.right; tmp.right = node; tmp.color = node.color; node.color = RED; return tmp; } // 顏色翻轉(zhuǎn) flipColors(node) { node.color = RED; node.left.color = BLACK; node.right.color = BLACK; } add(key, value) { this.root = this.addRoot(this.root, key, value); this.root.color = BLACK; // 根節(jié)點(diǎn)始終是黑色 } addRoot(node, key, value) { if (!node) { this.size++; return new Node(key, value); } if (key < node.key) { node.left = this.addRoot(node.left, key, value); } else if (key > node.key) { node.right = this.addRoot(node.right, key, value); } else { node.value = value; } if (this.isRed(node.right) && !this.isRed((node.left))) { node = this.leftRotate(node); } if (this.isRed(node.left) && this.isRed((node.left.left))) { node = this.rightRoate(node); } if (this.isRed(node.left) && this.isRed(node.right)) { this.flipColors(node); } return node; } isEmpty() { return this.size == 0 ? true : false; } getSize() { return this.size; } contains(key) { let ans = ""; !(function getNode(node, key) { if (!node || key == node.key) { ans = node; return node; } else if (key > node.key) { return getNode(node.right, key); } else { return getNode(node.right, key); } })(this.root, key); return !!ans; } // bst前序遍歷(遞歸版本) preOrder(node = this.root) { if (node == null) return; console.log(node.key); this.preOrder(node.left); this.preOrder(node.right); } preOrderNR() { if (this.root == null) return; let stack = []; stack.push(this.root); while (stack.length > 0) { let curNode = stack.pop(); console.log(curNode.key); if (curNode.right != null) stack.push(curNode.right); if (curNode.left != null) curNode.push(curNode.left); } } // bst中序遍歷 inOrder(node = this.root) { if (node == null) return; this.inOrder(node.left); console.log(node.key); this.inOrder(node.right); } // bst后續(xù)遍歷 postOrder(node = this.root) { if (node == null) return; this.postOrder(node.left); this.postOrder(node.right); console.log(node.key); } // bsf + 隊(duì)列的方式實(shí)現(xiàn)層次遍歷 generateDepthString1() { let queue = []; queue.unshift(this.root); while (queue.length > 0) { let tmpqueue = []; let ans = []; queue.forEach(item => { ans.push(item.key); item.left ? tmpqueue.push(item.left) : ""; item.right ? tmpqueue.push(item.right) : ""; }); console.log(...ans); queue = tmpqueue; } } minmun(node = this.root) { if (node.left == null) return node; return this.minmun(node.left); } maximum(node = this.root) { if (node.right == null) return node; return this.maximum(node.right); } }
let btins = new RBT(); let ary = [5, 3, 6, 8, 4, 2]; ary.forEach(value => btins.add(value)); btins.generateDepthString1(); // /////////////// // 5 // // / // // 3 8 // // / / // // 2 4 6 // // /////////////// console.log(btins.minmun()); // 2 console.log(btins.maximum()); // 8圖解
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100591.html
摘要:很多文章或書籍在介紹紅黑樹(shù)的時(shí)候直接上來(lái)就是紅黑樹(shù)的個(gè)基本性質(zhì)插入刪除操作等。這也不奇怪,算法的作者就是紅黑樹(shù)的作者之一。所以,理解樹(shù)對(duì)掌握紅黑樹(shù)是至關(guān)重要的。 本文主要包括以下內(nèi)容: 什么是2-3樹(shù) 2-3樹(shù)的插入操作 紅黑樹(shù)與2-3樹(shù)的等價(jià)關(guān)系 《算法4》和《算法導(dǎo)論》上關(guān)于紅黑樹(shù)的差異 紅黑樹(shù)的5條基本性質(zhì)的分析 紅黑樹(shù)與2-3-4樹(shù)的等價(jià)關(guān)系 紅黑樹(shù)的插入、刪除操作 JDK ...
摘要:并且,我們的底層都是紅黑樹(shù)來(lái)實(shí)現(xiàn)的。紅黑樹(shù)是一種平衡二叉樹(shù)因此它沒(méi)有節(jié)點(diǎn)。 前言 聲明,本文用得是jdk1.8 前面已經(jīng)講了Collection的總覽和剖析List集合: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 原本我是打算繼續(xù)將Collection下的Set集合的,結(jié)果看了源碼發(fā)現(xiàn):Set集合實(shí)際上就是HashMap來(lái)構(gòu)建的! showImg(https:/...
摘要:用這種范例表示紅黑樹(shù)是可能的,但是這會(huì)改變一些性質(zhì)并使算法復(fù)雜。插入會(huì)出現(xiàn)種情況為根節(jié)點(diǎn),即紅黑樹(shù)的根節(jié)點(diǎn)。 說(shuō)到HashMap,就一定要說(shuō)到紅黑樹(shù),紅黑樹(shù)作為一種自平衡二叉查找樹(shù),是一種用途較廣的數(shù)據(jù)結(jié)構(gòu),在jdk1.8中使用紅黑樹(shù)提升HashMap的性能,今天就來(lái)說(shuō)一說(shuō)紅黑樹(shù)。 前言 限于篇幅,本文只對(duì)紅黑樹(shù)的基礎(chǔ)進(jìn)行說(shuō)明,暫不涉及源碼部分,大部分摘抄自維基百科,這里也貼出對(duì)應(yīng)鏈接...
摘要:當(dāng)往中放入新的鍵值對(duì)后,可能會(huì)破壞紅黑樹(shù)的性質(zhì)。修復(fù)操作要重新使紅黑樹(shù)恢復(fù)平衡,修復(fù)操作的源碼分析如下方法分析如下上面對(duì)部分代碼邏輯就行了分析,通過(guò)配圖的形式解析了每段代碼邏輯所處理的情況。四總結(jié)本文可以看做是本人紅黑樹(shù)詳細(xì)分析一文的延續(xù)。 一、簡(jiǎn)介 TreeMap最早出現(xiàn)在JDK 1.2中,是 Java 集合框架中比較重要一個(gè)的實(shí)現(xiàn)。TreeMap 底層基于紅黑樹(shù)實(shí)現(xiàn),可保證在log...
摘要:需要執(zhí)行的操作依次是首先,將紅黑樹(shù)當(dāng)作一顆二叉查找樹(shù),將該節(jié)點(diǎn)從二叉查找樹(shù)中刪除然后,通過(guò)旋轉(zhuǎn)和重新著色等一系列來(lái)修正該樹(shù),使之重新成為一棵紅黑樹(shù)。 雖是讀書筆記,但是如轉(zhuǎn)載請(qǐng)注明出處 http://segmentfault.com/blog/exploring/ .. 拒絕伸手復(fù)制黨 關(guān)于二叉樹(shù)的基本知識(shí),可以參見(jiàn):Java 實(shí)現(xiàn)基本數(shù)據(jù)結(jié)構(gòu) 2(樹(shù)) 以下是算法導(dǎo)論第13章的學(xué)...
閱讀 891·2021-11-23 09:51
閱讀 1102·2021-11-15 17:57
閱讀 1673·2021-09-22 15:24
閱讀 819·2021-09-07 09:59
閱讀 2232·2019-08-29 15:10
閱讀 1856·2019-08-29 12:47
閱讀 759·2019-08-29 12:30
閱讀 3376·2019-08-26 13:51