亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

二叉樹的順序插入

forsigner / 1089人閱讀

摘要:每次插入的新節(jié)點都會入列。同時,若新節(jié)點被插入到父節(jié)點的右下方,則該父節(jié)點出列。

模擬過程

插入根節(jié)點A

在父節(jié)點A的左下方插入子節(jié)點B

在父節(jié)點A的右下方插入子節(jié)點C

在父節(jié)點B的左下方插入子節(jié)點D

在父節(jié)點B的右下方插入子節(jié)點E

在父節(jié)點C的左下方插入子節(jié)點F
...

分析過程

每次插入節(jié)點需明確被插入的父節(jié)點以及被插入的位置(左右)

明確被插入的父節(jié)點

第1步中,需將A存儲,因為A在第2,3步中被取出,作為插入操作的父節(jié)點
第2步中,需將B存儲,因為B在第4,5步中被取出,作為插入操作的父節(jié)點
第3步中,需將C存儲,因為C在第6步中被取出,作為插入操作的父節(jié)點,與此同時,A在被執(zhí)行右下方的插入操作后,A不能再被插入子節(jié)點
...
第5步中,需將E存儲,其在后續(xù)的操作中會被取出,作為插入操作的父節(jié)點,與此同時,B與A一樣,在被執(zhí)行右下方的插入操作后,B不能再被插入子節(jié)點
建個隊列,將后續(xù)操作中會被取出的節(jié)點存儲,不會再被取出的節(jié)點移除。每次插入的新節(jié)點都會入列。同時,若新節(jié)點被插入到父節(jié)點的右下方,則該父節(jié)點出列。

明確被插入的位置

被插入的位置可以通過插入的次數(shù)來判斷,若是第1次插入,則是根節(jié)點,若是第n(n>1)次插入,n為偶,則插入左邊,n為奇,則插入右邊
故用個變量存儲插入的次數(shù)

代碼

運行環(huán)境node v8.4

function Node(value) {
  this.value = value
  this.left = null
  this.right = null
}

function BinaryTree() {
  this.root = null // 樹根
  this.queue = [] // 存儲會被使用的父節(jié)點
  this.insertNum = 0 // 記錄插入操作的次數(shù)
}

BinaryTree.prototype.insert = function (value) {
  this.insertNum++ // 插入次數(shù)加1
    let node = new Node(value)
  if (!this.root) { // 判斷根節(jié)點是否存在
    this.root = node // 插入根節(jié)點
    this.queue.push(this.root) // 新節(jié)點入列
  } else { // 插入非根節(jié)點
    let parent = this.queue[0] // 被插入的父節(jié)點
    if (!(this.insertNum % 2)) { // 通過插入次數(shù)判斷左右
      parent.left = node // 插入左邊
      this.queue.push(parent.left) // 新節(jié)點入列
    } else {
      parent.right = node // 插入右邊
      this.queue.push(parent.right) // 新節(jié)點入列
      this.queue.shift() // 當前父節(jié)點parent 已經(jīng)不可能再插入子節(jié)點,故出列
    }
  }
  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é)點

首先需要判斷插入的節(jié)點是否為空節(jié)點
若是空節(jié)點,其不會作為父節(jié)點被執(zhí)行插入操作,故不用入列

改進代碼
BinaryTree.prototype.insert = function (value) {
  this.insertNum++ // 插入次數(shù)加1
    let node = (!value && typeof value === "object") ? null : new Node(value) // 判斷是否為空節(jié)點

  if (!this.root) { // 判斷根節(jié)點是否存在
    this.root = node // 插入根節(jié)點
    node && this.queue.push(this.root) // 非空節(jié)點入列
  } else { // 插入非根節(jié)點
    let parent = this.queue[0] // 被插入的父節(jié)點
    if (!(this.insertNum % 2)) { // 通過插入次數(shù)判斷左右
      parent.left = node // 插入左邊
      node && this.queue.push(parent.left) // 非空節(jié)點入列
    } else {
      parent.right = node // 插入右邊
      node && this.queue.push(parent.right) // 非空節(jié)點入列
      this.queue.shift() // 當前父節(jié)點parent 已經(jīng)不可能再插入子節(jié)點,故出列
    }
  }
  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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89168.html

相關文章

  • Java數(shù)據(jù)結(jié)構(gòu)與算法——叉樹及操作(包括叉樹遍歷)

    摘要:本篇主要介紹二叉樹的概念二叉樹的表示二叉樹的操作三種遍歷方式實現(xiàn)求二叉樹的子樹求節(jié)點的父節(jié)點二叉樹高度,可能是考試中的,也可能是面試中的。通常二叉樹的遍歷根據(jù)根節(jié)點的遍歷次序分為先根遍歷中根遍歷后根遍歷。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本篇主要介紹二叉樹的概念、二叉樹的表示、二叉樹的操作(三種遍歷...

    muddyway 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法:叉樹算法

    摘要:因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫出二叉樹選參考數(shù)據(jù)結(jié)構(gòu)與算法描述實現(xiàn)二叉樹算法淺談數(shù)據(jù)結(jié)構(gòu)二叉樹慕課網(wǎng)實現(xiàn)二叉樹算法前端樹控件騰訊軟件開發(fā)面試題 內(nèi)容銜接上一章 數(shù)據(jù)結(jié)構(gòu)與算法:常見排序算法 內(nèi)容提要 什么是樹   - 為什么使用樹 二叉樹 二叉查找樹 紅黑樹 B、B+樹 堆 伸展樹 樹 可以點擊鏈接感受下筆者用d3.js畫的tree https://codepen...

    Little_XM 評論0 收藏0
  • 樹及其外部存儲

    摘要:切記,紅黑樹在旋轉(zhuǎn)和顏色變換的過程中,必須遵守紅黑樹的幾條規(guī)則。樹的外部存儲磁盤布局計算機中的機械磁盤是由磁頭和圓盤組成,每個圓盤上劃分為多個磁道,每個磁道又劃分為多個扇區(qū)。 術(shù)語 showImg(https://segmentfault.com/img/bVbai3r?w=643&h=407); 根 ????樹最頂端的節(jié)點稱為根,一棵樹只有一個根 父節(jié)點 ????每個節(jié)...

    _Dreams 評論0 收藏0
  • 基礎數(shù)據(jù)結(jié)構(gòu)和算法概念

    摘要:數(shù)據(jù)結(jié)構(gòu)程序數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)基本概念數(shù)據(jù)的邏輯結(jié)構(gòu)反映數(shù)據(jù)元素之間的關系的數(shù)據(jù)元素集合的表示。這兩部分信息組成數(shù)據(jù)元素的存儲映象,稱為結(jié)點。 本文涉及更多的是概念,代碼部分請參考之前寫過的 2 篇博客 基于 Javascript 的排序算法 基于 javascript 的基本數(shù)據(jù)結(jié)構(gòu)和查找算法 本文主要是基礎的數(shù)據(jù)結(jié)構(gòu)和算法概念,可能部分地方會涉及更高級的算法和算法,具體內(nèi)容以...

    fsmStudy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<