欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript實(shí)現(xiàn)二叉樹的代碼

 更新時(shí)間:2017年06月08日 11:25:57   作者:issac_寶華  
本篇文章主要介紹了javascript實(shí)現(xiàn)二叉樹的代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言:

二叉樹的特點(diǎn)(例圖只是二叉樹的一種情況,不要嘗試用例圖推理以下結(jié)論)

  1. 除了最下面一層,每個(gè)節(jié)點(diǎn)都是父節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有且最多有兩個(gè)子節(jié)點(diǎn);
  2. 除了嘴上面一層,每個(gè)節(jié)點(diǎn)是子節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)父節(jié)點(diǎn);
  3. 最上面一層的節(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • javascript cookies 設(shè)置、讀取、刪除實(shí)例代碼

    javascript cookies 設(shè)置、讀取、刪除實(shí)例代碼

    javascript cookies 存、取、刪除實(shí)例,也是不錯(cuò)的文章,跟我們整理的有些補(bǔ)充。
    2010-04-04
  • js仿京東放大鏡效果

    js仿京東放大鏡效果

    這篇文章主要為大家詳細(xì)介紹了js仿京東放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JS庫(kù)之Highlight.js的用法詳解

    JS庫(kù)之Highlight.js的用法詳解

    highlight.js是一款輕量級(jí)的Web代碼語(yǔ)法高亮庫(kù)。下面通過(guò)實(shí)例代碼給大家分享JS庫(kù)之Highlight.js的用法詳解,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2017-09-09
  • JS實(shí)現(xiàn)的Unicode編碼轉(zhuǎn)換操作示例

    JS實(shí)現(xiàn)的Unicode編碼轉(zhuǎn)換操作示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的Unicode編碼轉(zhuǎn)換操作,結(jié)合完整實(shí)例形式分析了javascript實(shí)現(xiàn)Unicode編碼轉(zhuǎn)換的具體操作技巧,需要的朋友可以參考下
    2017-04-04
  • js圖片模糊切換顯示特效的方法

    js圖片模糊切換顯示特效的方法

    這篇文章主要介紹了js圖片模糊切換顯示特效的方法,涉及js操作圖片特效的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • webpack?loader使用的安裝配置

    webpack?loader使用的安裝配置

    這篇文章主要為大家介紹了webpack?loader使用的安裝配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 基于JavaScript實(shí)現(xiàn)單例模式

    基于JavaScript實(shí)現(xiàn)單例模式

    這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)單例模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • JavaScript無(wú)操作后屏保功能的實(shí)現(xiàn)方法

    JavaScript無(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
  • Js 獲取、判斷瀏覽器版本信息的簡(jiǎn)單方法

    Js 獲取、判斷瀏覽器版本信息的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇Js 獲取、判斷瀏覽器版本信息的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • js操作二進(jìn)制數(shù)據(jù)方法

    js操作二進(jìn)制數(shù)據(jù)方法

    下面小編就為大家分享一篇js操作二進(jìn)制數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)的大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03

最新評(píng)論