javascript實(shí)現(xiàn)二叉樹的代碼
前言:
二叉樹的特點(diǎn)(例圖只是二叉樹的一種情況,不要嘗試用例圖推理以下結(jié)論)
- 除了最下面一層,每個(gè)節(jié)點(diǎn)都是父節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有且最多有兩個(gè)子節(jié)點(diǎn);
- 除了嘴上面一層,每個(gè)節(jié)點(diǎn)是子節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)父節(jié)點(diǎn);
- 最上面一層的節(jié)點(diǎn)(即例圖中的節(jié)點(diǎn)50)為根節(jié)點(diǎn);
最下面一層的節(jié)點(diǎn)稱為葉子節(jié)點(diǎn),他們沒(méi)有子節(jié)點(diǎn);
左子節(jié)點(diǎn)的值 < 父節(jié)點(diǎn)的值 <= 右節(jié)點(diǎn)的值
1 節(jié)點(diǎn)的javascript實(shí)現(xiàn)
// 節(jié)點(diǎn)對(duì)象 function Node(data, left, right) { this.data = data; // 節(jié)點(diǎn)值 this.left = left; // 當(dāng)前節(jié)點(diǎn)的左子節(jié)點(diǎn) this.right = right; // 當(dāng)前節(jié)點(diǎn)的右子節(jié)點(diǎn) this.show = show; // 輔助function } function show() { return this.data; }
感受下上面實(shí)現(xiàn)節(jié)點(diǎn)的代碼,感覺(jué)和鏈表有點(diǎn)相似不是嗎,存著當(dāng)前值,又存著下個(gè)節(jié)點(diǎn)(左、右子節(jié)點(diǎn))的引用,下面是一張偽代碼的草圖:
2 二叉樹的實(shí)現(xiàn)
實(shí)現(xiàn)二叉樹,當(dāng)然就是要插入節(jié)點(diǎn)構(gòu)成二叉樹,先看看實(shí)現(xiàn)二叉樹的js代碼
function BST() { this.root = null; this.insert = insert; } function insert(data) { var n = new Node(data, null, null); if (this.root == null) { this.root = n; } else { var current = this.root; var parent; while (true) { parent = current; if (data < current.data) { current = current.left; if (current == null) { parent.left = n; break; } } else { current = current.right; if (current == null) { parent.right = n; break; } } } } }
然后是看一下偽代碼:
function BST() { this.root = null; // 根節(jié)點(diǎn) this.insert = insert; } function insert(data) { // 初始化一個(gè)節(jié)點(diǎn),為什么要將左右子節(jié)點(diǎn)的引用初始化為空呢,因?yàn)榭赡苁侨~子節(jié)點(diǎn),加入他有子節(jié)點(diǎn),會(huì)在下面的代碼添加 var n = new Node(data, null, null); if (該二叉樹是否為空,是空則根節(jié)點(diǎn)為空,因此可以用根節(jié)點(diǎn)判斷二叉樹是否為空) { // 將當(dāng)前節(jié)點(diǎn)存為根節(jié)點(diǎn) this.root = n; } else { // 來(lái)到這里就表示,該二叉樹不為空,這里關(guān)鍵的是兩句代碼: // 0.while (true); // 1.parent = current; // 2.current = current.left;/current = current.right; // 3.break; var current = this.root; var parent; while (true) { parent = current; // 獲得父節(jié)點(diǎn),第一次循環(huán),那么父節(jié)點(diǎn)就是根節(jié)點(diǎn) if (data < current.data) { // 當(dāng)前節(jié)點(diǎn)值小于父節(jié)點(diǎn)的值就是存左邊,記得二叉樹的特點(diǎn)吧,如果真是小于父節(jié)點(diǎn),那么就說(shuō)明該節(jié)點(diǎn)屬于,該父節(jié)點(diǎn)的左子樹。 current = current.left; if (current == null) { parent.left = n; break; } // 其實(shí)上面這樣寫不好理解,可以等價(jià)于下面的代碼: // start if(current.left == null){ // 若果左節(jié)點(diǎn)空,那么這個(gè)空的節(jié)點(diǎn)就是我們要插入的位置 current.left = n; break; }else{ // 不空則繼續(xù)往下一層找空節(jié)點(diǎn)(插入的位置) current = current.left; } // end } else { // 右節(jié)點(diǎn)的邏輯代碼個(gè)左節(jié)點(diǎn)的一樣的 current = current.right; if (current == null) { parent.right = n; break; } } } } }
下面是一個(gè)更好理解的插入函數(shù)
function insert(data) { var n = new Node(data, null, null); if (this.root == null) { this.root = n; } else { var current = this.root; // start change while (true) { if (data < current.data) { if (current.left == null) { current.left = n; break; }else{ current = current.left; } }else { if (current.right == null) { current.right = n; break; }else{ current = current.right; } } } } }
小結(jié):
二叉樹的實(shí)現(xiàn)的三個(gè)部件
Node對(duì)象
function Node(data, left, right) { ... }
BST對(duì)象
function BST() { ... }
插入節(jié)點(diǎn)函數(shù)
function insert(data) { ... }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS中的二叉樹遍歷詳解
- JS實(shí)現(xiàn)的二叉樹算法完整實(shí)例
- JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹詳解
- JS二叉樹的簡(jiǎn)單實(shí)現(xiàn)方法示例
- JavaScript實(shí)現(xiàn)二叉樹的先序、中序及后序遍歷方法詳解
- javascript實(shí)現(xiàn)二叉樹遍歷的代碼
- JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的刪除算法示例
- JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的遍歷算法示例
- JavaScript數(shù)據(jù)結(jié)構(gòu)之二叉樹的查找算法示例
- js構(gòu)建二叉樹進(jìn)行數(shù)值數(shù)組的去重與優(yōu)化詳解
相關(guān)文章
javascript cookies 設(shè)置、讀取、刪除實(shí)例代碼
javascript cookies 存、取、刪除實(shí)例,也是不錯(cuò)的文章,跟我們整理的有些補(bǔ)充。2010-04-04JS實(shí)現(xiàn)的Unicode編碼轉(zhuǎn)換操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)的Unicode編碼轉(zhuǎn)換操作,結(jié)合完整實(shí)例形式分析了javascript實(shí)現(xiàn)Unicode編碼轉(zhuǎn)換的具體操作技巧,需要的朋友可以參考下2017-04-04JavaScript無(wú)操作后屏保功能的實(shí)現(xiàn)方法
今天組里的同事要寫一個(gè)屏保的效果,要求鼠標(biāo)無(wú)操作N秒后進(jìn)入屏幕保護(hù),滑動(dòng)鼠標(biāo)的時(shí)候取消屏幕保護(hù)。我真是難倒了,糾結(jié)了半天,搞定了,下面給大家分享實(shí)現(xiàn)代碼2017-07-07