国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

二叉樹(shù)的順序插入

forsigner / 1046人閱讀

摘要:每次插入的新節(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
...

分析過(guò)程

每次插入節(jié)點(diǎn)需明確被插入的父節(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í)行插入操作,故不用入列

改進(jìn)代碼
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

相關(guān)文章

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

    摘要:本篇主要介紹二叉樹(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ù)的操作(三種遍歷...

    muddyway 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法:叉樹(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...

    Little_XM 評(píng)論0 收藏0
  • 樹(shù)及其外部存儲(chǔ)

    摘要:切記,紅黑樹(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é)...

    _Dreams 評(píng)論0 收藏0
  • 基礎(chǔ)數(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ù)元素之間的關(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)容以...

    fsmStudy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<