最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言:

二叉樹的特點(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),他們沒有子節(jié)點(diǎn);

左子節(jié)點(diǎn)的值 < 父節(jié)點(diǎn)的值 <= 右節(jié)點(diǎn)的值

1 節(jié)點(diǎn)的javascript實(shí)現(xiàn)

// 節(jié)點(diǎn)對象
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)的代碼,感覺和鏈表有點(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 {
   // 來到這里就表示,該二叉樹不為空,這里關(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),那么就說明該節(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對象

function Node(data, left, right) { ... }

BST對象

function BST() { ... }

插入節(jié)點(diǎn)函數(shù)

function insert(data) { ... }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 小程序如何構(gòu)建骨架屏

    小程序如何構(gòu)建骨架屏

    最近在移動(dòng)端上面看到不同于菊花圖的加載方式,就是這篇文章需要分享的Skeleton Screen,中文稱之為"骨架屏",下面我們來簡單了解一下吧
    2019-05-05
  • js 獲取經(jīng)緯度的實(shí)現(xiàn)方法

    js 獲取經(jīng)緯度的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s 獲取經(jīng)緯度的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Bootstrap彈出框(Popover)被擠壓的問題小結(jié)

    Bootstrap彈出框(Popover)被擠壓的問題小結(jié)

    比較了下Bootstrap的popover和一些其它的開源項(xiàng)目,覺得Bootstrap的還算不錯(cuò)。在使用過程中遇到了一系列問題,下面小編給大家分享Bootstrap彈出框(Popover)被擠壓的問題小結(jié),需要的朋友參考下吧
    2017-07-07
  • 微信小程序?qū)W習(xí)筆記之目錄結(jié)構(gòu)、基本配置圖文詳解

    微信小程序?qū)W習(xí)筆記之目錄結(jié)構(gòu)、基本配置圖文詳解

    這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之目錄結(jié)構(gòu)、基本配置,結(jié)合實(shí)例形式詳細(xì)分析了微信小程序的相關(guān)注冊、配置及基本使用方法,并配以圖片加以說明,需要的朋友可以參考下
    2019-03-03
  • Webkit的跨域安全問題說明

    Webkit的跨域安全問題說明

    在使用try catch處理iframe跨域產(chǎn)生的異常時(shí),chrome和safari瀏覽器似乎不能正常運(yùn)作:他們直接拋出了錯(cuò)誤而沒有拋出可供JS截獲的異常。
    2011-09-09
  • 一篇文章讓你搞清楚JavaScript事件循環(huán)

    一篇文章讓你搞清楚JavaScript事件循環(huán)

    通過JS的事件循環(huán)機(jī)制,可以更清楚JS代碼的執(zhí)行流,下面這篇文章主要給大家介紹了關(guān)于如何通過一篇文章讓你搞清楚JavaScript事件循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 使用Axios函數(shù)庫進(jìn)行網(wǎng)絡(luò)請求的操作指南

    使用Axios函數(shù)庫進(jìn)行網(wǎng)絡(luò)請求的操作指南

    在現(xiàn)代的前端開發(fā)中,API調(diào)用是實(shí)現(xiàn)前后端數(shù)據(jù)交互的重要環(huán)節(jié),而在眾多的HTTP庫中,Axios以其簡潔的語法、豐富的功能和易于擴(kuò)展的特性,成為了開發(fā)者的首選,本篇文章將深入介紹Axios的使用方法,
    2024-11-11
  • Javascript節(jié)點(diǎn)關(guān)系實(shí)例分析

    Javascript節(jié)點(diǎn)關(guān)系實(shí)例分析

    這篇文章主要介紹了Javascript節(jié)點(diǎn)關(guān)系,實(shí)例分析了javascript操作父子節(jié)點(diǎn)及兄弟節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 對JavaScript中this指針的新理解分享

    對JavaScript中this指針的新理解分享

    這篇文章主要介紹了對JavaScript中this指針的新理解分享,本文講解了方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造函數(shù)調(diào)用模式、Apply調(diào)用模式中的this指針理解,需要的朋友可以參考下
    2015-01-01
  • javascript跨域方法、原理以及出現(xiàn)問題解決方法(詳解)

    javascript跨域方法、原理以及出現(xiàn)問題解決方法(詳解)

    javascript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對象。但是在安全限制的同時(shí)也給注入iframe或是ajax應(yīng)用上帶來了不少麻煩??缬蚝唵蔚睦斫饩褪且?yàn)閖avascript同源策略的限制,a.com域名下的js無法操作b.com 或者是c.a.com域名下的對象
    2015-08-08

最新評(píng)論

临湘市| 乌苏市| 郁南县| 宁夏| 满城县| 普陀区| 屯留县| 安西县| 达拉特旗| 嫩江县| 通道| 扬州市| 定州市| 贵阳市| 镇平县| 托克托县| 布尔津县| 双江| 荣昌县| 河池市| 绥中县| 庄河市| 丹凤县| 江油市| 郸城县| 平阴县| 特克斯县| 金溪县| 凤庆县| 津市市| 津南区| 巨野县| 金华市| 岳普湖县| 铁力市| 琼海市| 慈溪市| 荥经县| 通河县| 固始县| 昌黎县|