javascript
使用javascript模拟常见数据结构(四)
七、樹
樹是一種非線性的分層的數(shù)據(jù)結(jié)構(gòu),在現(xiàn)實生活中比較常見的例子比如家譜和公司的組織架構(gòu)圖,如下所示:
一個樹結(jié)構(gòu)存在著一系列的父子結(jié)構(gòu),并且有著一個根節(jié)點,這種結(jié)構(gòu)本質(zhì)上表明了一對多的關(guān)系。
那,如同上面這樣的結(jié)構(gòu),一個節(jié)點可以有多個子節(jié)點,但最多只能有一個父節(jié)點,如果每個節(jié)點的子節(jié)點數(shù)都不大于2,那么我們可以把這樣一棵樹叫做二叉樹。而如果這棵樹的左側(cè)的節(jié)點均小于其根節(jié)點,而右側(cè)的節(jié)點都大于根節(jié)點,那么我們管這樣的一棵樹叫做搜索二叉樹(BST)。
我們可以用以下js代碼構(gòu)建二叉搜索樹:
1 function BinarySearchTree() { 2 var Node = function(key){ 3 this.key = key; 4 this.left = null; 5 this.right = null; 6 }; 7 var root = null; 8 }
嗯嗯,其實就如同下圖所示:
嗯,老慣例,還是有一些方法需要介紹,下面繼續(xù)貼一些代碼,大家看到名字其實就基本知道是干嘛的了。
var insertNode = function(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);}} };
嗯,上面是插入的方法,用到了遞歸,下面說幾個遍歷的方法。
var inOrderTraverseNode = function (node, callback) {if (node !== null) { inOrderTraverseNode(node.left, callback); callback(node.key); inOrderTraverseNode(node.right, callback); } }這個是中序遍歷,其遍歷過程大概如下圖所示:
嗯,可以看到,這樣遍歷完了之后是從下到大的,可以用于排序。
然后,先序遍歷
var preOrderTraverseNode = function (node, callback) {if (node !== null) {callback(node.key); preOrderTraverseNode(node.left, callback); preOrderTraverseNode(node.right, callback); } }
?
恩,然后這個就是先序遍歷~最后一種就是后序遍歷,其實就是最后來訪問根節(jié)點。
var postOrderTraverseNode = function (node, callback) {if (node !== null) {postOrderTraverseNode(node.left, callback); //{1}postOrderTraverseNode(node.right, callback); //{2}callback(node.key); //{3} } };
?
轉(zhuǎn)載于:https://www.cnblogs.com/shicongbuct/p/6822158.html
總結(jié)
以上是生活随笔為你收集整理的使用javascript模拟常见数据结构(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改input的placeholder颜
- 下一篇: SpringMVC整合MongoDB