摘要:每次插入的新節(jié)點(diǎn)都會(huì)入列。同時(shí),若新節(jié)點(diǎn)被插入到父節(jié)點(diǎn)的右下方,則該父節(jié)點(diǎn)出列。
模擬過(guò)程
插入根節(jié)點(diǎn)A
在父節(jié)點(diǎn)A的左下方插入子節(jié)點(diǎn)B
在父節(jié)點(diǎn)A的右下方插入子節(jié)點(diǎn)C
在父節(jié)點(diǎn)B的左下方插入子節(jié)點(diǎn)D
在父節(jié)點(diǎn)B的右下方插入子節(jié)點(diǎn)E
在父節(jié)點(diǎn)C的左下方插入子節(jié)點(diǎn)F
...
每次插入節(jié)點(diǎn)需明確被插入的父節(jié)點(diǎn)以及被插入的位置(左右)
第1步中,需將A存儲(chǔ),因?yàn)锳在第2,3步中被取出,作為插入操作的父節(jié)點(diǎn)
第2步中,需將B存儲(chǔ),因?yàn)锽在第4,5步中被取出,作為插入操作的父節(jié)點(diǎn)
第3步中,需將C存儲(chǔ),因?yàn)镃在第6步中被取出,作為插入操作的父節(jié)點(diǎn),與此同時(shí),A在被執(zhí)行右下方的插入操作后,A不能再被插入子節(jié)點(diǎn)
...
第5步中,需將E存儲(chǔ),其在后續(xù)的操作中會(huì)被取出,作為插入操作的父節(jié)點(diǎn),與此同時(shí),B與A一樣,在被執(zhí)行右下方的插入操作后,B不能再被插入子節(jié)點(diǎn)
故建個(gè)隊(duì)列,將后續(xù)操作中會(huì)被取出的節(jié)點(diǎn)存儲(chǔ),不會(huì)再被取出的節(jié)點(diǎn)移除。每次插入的新節(jié)點(diǎn)都會(huì)入列。同時(shí),若新節(jié)點(diǎn)被插入到父節(jié)點(diǎn)的右下方,則該父節(jié)點(diǎn)出列。
被插入的位置可以通過(guò)插入的次數(shù)來(lái)判斷,若是第1次插入,則是根節(jié)點(diǎn),若是第n(n>1)次插入,n為偶,則插入左邊,n為奇,則插入右邊
故用個(gè)變量存儲(chǔ)插入的次數(shù)
運(yùn)行環(huán)境node v8.4
function Node(value) { this.value = value this.left = null this.right = null } function BinaryTree() { this.root = null // 樹(shù)根 this.queue = [] // 存儲(chǔ)會(huì)被使用的父節(jié)點(diǎn) this.insertNum = 0 // 記錄插入操作的次數(shù) } BinaryTree.prototype.insert = function (value) { this.insertNum++ // 插入次數(shù)加1 let node = new Node(value) if (!this.root) { // 判斷根節(jié)點(diǎn)是否存在 this.root = node // 插入根節(jié)點(diǎn) this.queue.push(this.root) // 新節(jié)點(diǎn)入列 } else { // 插入非根節(jié)點(diǎn) let parent = this.queue[0] // 被插入的父節(jié)點(diǎn) if (!(this.insertNum % 2)) { // 通過(guò)插入次數(shù)判斷左右 parent.left = node // 插入左邊 this.queue.push(parent.left) // 新節(jié)點(diǎn)入列 } else { parent.right = node // 插入右邊 this.queue.push(parent.right) // 新節(jié)點(diǎn)入列 this.queue.shift() // 當(dāng)前父節(jié)點(diǎn)parent 已經(jīng)不可能再插入子節(jié)點(diǎn),故出列 } } return this } let binaryTree = new BinaryTree() binaryTree.insert("A") .insert("B") .insert("C") .insert("D") .insert("E") .insert("F") console.log(JSON.stringify(binaryTree.root, null, 4))插入空節(jié)點(diǎn)
首先需要判斷插入的節(jié)點(diǎn)是否為空節(jié)點(diǎn)
若是空節(jié)點(diǎn),其不會(huì)作為父節(jié)點(diǎn)被執(zhí)行插入操作,故不用入列
BinaryTree.prototype.insert = function (value) { this.insertNum++ // 插入次數(shù)加1 let node = (!value && typeof value === "object") ? null : new Node(value) // 判斷是否為空節(jié)點(diǎn) if (!this.root) { // 判斷根節(jié)點(diǎn)是否存在 this.root = node // 插入根節(jié)點(diǎn) node && this.queue.push(this.root) // 非空節(jié)點(diǎn)入列 } else { // 插入非根節(jié)點(diǎn) let parent = this.queue[0] // 被插入的父節(jié)點(diǎn) if (!(this.insertNum % 2)) { // 通過(guò)插入次數(shù)判斷左右 parent.left = node // 插入左邊 node && this.queue.push(parent.left) // 非空節(jié)點(diǎn)入列 } else { parent.right = node // 插入右邊 node && this.queue.push(parent.right) // 非空節(jié)點(diǎn)入列 this.queue.shift() // 當(dāng)前父節(jié)點(diǎn)parent 已經(jīng)不可能再插入子節(jié)點(diǎn),故出列 } } return this } let binaryTree = new BinaryTree() binaryTree.insert("A") .insert("B") .insert("C") .insert("D") .insert("E") .insert(null) .insert("F") .insert("G") console.log(JSON.stringify(binaryTree.root, null, 4))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89168.html
摘要:本篇主要介紹二叉樹(shù)的概念二叉樹(shù)的表示二叉樹(shù)的操作三種遍歷方式實(shí)現(xiàn)求二叉樹(shù)的子樹(shù)求節(jié)點(diǎn)的父節(jié)點(diǎn)二叉樹(shù)高度,可能是考試中的,也可能是面試中的。通常二叉樹(shù)的遍歷根據(jù)根節(jié)點(diǎn)的遍歷次序分為先根遍歷中根遍歷后根遍歷。 聲明:碼字不易,轉(zhuǎn)載請(qǐng)注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會(huì)不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇主要介紹二叉樹(shù)的概念、二叉樹(shù)的表示、二叉樹(shù)的操作(三種遍歷...
摘要:因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫出二叉樹(shù)選參考數(shù)據(jù)結(jié)構(gòu)與算法描述實(shí)現(xiàn)二叉樹(shù)算法淺談數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)慕課網(wǎng)實(shí)現(xiàn)二叉樹(shù)算法前端樹(shù)控件騰訊軟件開(kāi)發(fā)面試題 內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:常見(jiàn)排序算法 內(nèi)容提要 什么是樹(shù) - 為什么使用樹(shù) 二叉樹(shù) 二叉查找樹(shù) 紅黑樹(shù) B、B+樹(shù) 堆 伸展樹(shù) 樹(shù) 可以點(diǎn)擊鏈接感受下筆者用d3.js畫的tree https://codepen...
摘要:切記,紅黑樹(shù)在旋轉(zhuǎn)和顏色變換的過(guò)程中,必須遵守紅黑樹(shù)的幾條規(guī)則。樹(shù)的外部存儲(chǔ)磁盤布局計(jì)算機(jī)中的機(jī)械磁盤是由磁頭和圓盤組成,每個(gè)圓盤上劃分為多個(gè)磁道,每個(gè)磁道又劃分為多個(gè)扇區(qū)。 術(shù)語(yǔ) showImg(https://segmentfault.com/img/bVbai3r?w=643&h=407); 根 ????樹(shù)最頂端的節(jié)點(diǎn)稱為根,一棵樹(shù)只有一個(gè)根 父節(jié)點(diǎn) ????每個(gè)節(jié)...
摘要:數(shù)據(jù)結(jié)構(gòu)程序數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)基本概念數(shù)據(jù)的邏輯結(jié)構(gòu)反映數(shù)據(jù)元素之間的關(guān)系的數(shù)據(jù)元素集合的表示。這兩部分信息組成數(shù)據(jù)元素的存儲(chǔ)映象,稱為結(jié)點(diǎn)。 本文涉及更多的是概念,代碼部分請(qǐng)參考之前寫過(guò)的 2 篇博客 基于 Javascript 的排序算法 基于 javascript 的基本數(shù)據(jù)結(jié)構(gòu)和查找算法 本文主要是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法概念,可能部分地方會(huì)涉及更高級(jí)的算法和算法,具體內(nèi)容以...
閱讀 3576·2021-09-24 09:48
閱讀 1100·2021-09-10 10:51
閱讀 3278·2019-08-30 13:03
閱讀 3326·2019-08-30 12:51
閱讀 1395·2019-08-30 11:22
閱讀 1071·2019-08-29 18:38
閱讀 2042·2019-08-29 16:41
閱讀 3207·2019-08-29 15:32