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

資訊專(zhuān)欄INFORMATION COLUMN

Javascript 數(shù)據(jù)結(jié)構(gòu)與算法——二叉樹(shù)

shengguo / 2899人閱讀

摘要:一個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)二叉樹(shù)二叉樹(shù)是一種特殊的樹(shù),子節(jié)點(diǎn)數(shù)不超過(guò)個(gè)。以某種特定的順序訪(fǎng)問(wèn)樹(shù)中所有的節(jié)點(diǎn)稱(chēng)為樹(shù)的遍歷樹(shù)的層數(shù)稱(chēng)為樹(shù)的深度一個(gè)父節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)分別稱(chēng)為左節(jié)點(diǎn)和右節(jié)點(diǎn)二叉查找樹(shù)又稱(chēng)二叉排序樹(shù)是一種特殊的二叉樹(shù)。

原文地址:http://www.brandhuang.com/article/1564967352592

1、樹(shù)

一棵樹(shù)最上面的節(jié)點(diǎn):根結(jié)點(diǎn)

一個(gè)節(jié)點(diǎn)下面連接多個(gè)節(jié)點(diǎn),那個(gè)這個(gè)節(jié)點(diǎn)稱(chēng)「為父節(jié)點(diǎn)」,它下面的節(jié)點(diǎn)稱(chēng)為「子節(jié)點(diǎn)」,沒(méi)有任何子節(jié)點(diǎn)的節(jié)點(diǎn)稱(chēng)為「葉子節(jié)點(diǎn)」。

一個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)

2、二叉樹(shù)

二叉樹(shù)是一種特殊的樹(shù),子節(jié)點(diǎn)數(shù)不超過(guò)「2個(gè)」。

以某種特定的順序訪(fǎng)問(wèn)樹(shù)中所有的節(jié)點(diǎn)稱(chēng)為樹(shù)的遍歷

樹(shù)的層數(shù)稱(chēng)為「樹(shù)的深度

一個(gè)父節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)分別稱(chēng)為「左節(jié)點(diǎn)」和「右節(jié)點(diǎn)

二叉查找樹(shù)」(又稱(chēng)二叉排序樹(shù))是一種特殊的二叉樹(shù)。++相對(duì)較小的值保存在左節(jié)點(diǎn)中,相對(duì)較大的值保存在右節(jié)點(diǎn)中++

3、js構(gòu)建以一顆二叉樹(shù)

用代碼構(gòu)建二叉樹(shù)前,先要在腦中不斷的重復(fù)二叉樹(shù)的重要特點(diǎn):

二叉樹(shù)有一個(gè)父節(jié)點(diǎn)和左右兩個(gè)子節(jié)點(diǎn);

每個(gè)節(jié)點(diǎn)有一個(gè)值,稱(chēng)為節(jié)點(diǎn)值;

左節(jié)點(diǎn)的值小于父節(jié)點(diǎn)的值,右節(jié)點(diǎn)的值大于父節(jié)點(diǎn)值。

明白了這三點(diǎn),我們就可以開(kāi)始寫(xiě)代碼了

構(gòu)建二叉樹(shù)的完整代碼請(qǐng)看文末

3.1 創(chuàng)建一個(gè)二叉樹(shù)對(duì)象

創(chuàng)建一個(gè)二叉樹(shù)對(duì)象,定義一個(gè)對(duì)象來(lái)保存節(jié)點(diǎn)的值和其子節(jié)點(diǎn)

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節(jié)點(diǎn)值
        this.left = null    // 該節(jié)點(diǎn)的左節(jié)點(diǎn)
        this.right = null   // 該節(jié)點(diǎn)的右節(jié)點(diǎn)
    }
    let root = null         // 根結(jié)點(diǎn),初始值為null
}
3.2 創(chuàng)建一個(gè)構(gòu)建二叉樹(shù)的函數(shù)

在binaryTree中創(chuàng)建一個(gè)insert方法,通過(guò)insert方法向樹(shù)中添加新節(jié)點(diǎn)

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節(jié)點(diǎn)值
        this.left = null    // 該節(jié)點(diǎn)的左節(jié)點(diǎn)
        this.right = null   // 該節(jié)點(diǎn)的右節(jié)點(diǎn)
    }
    let root = null         // 根結(jié)點(diǎn),初始值為null
    
    
    let insertNode = function(node, newNode){
        if (newNode.key < node.key) { // 如果新節(jié)點(diǎn)的key值小于原來(lái)節(jié)點(diǎn)的key值,則該新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)加入
        if (node.left) { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)已經(jīng)存在,則繼續(xù)執(zhí)行insertNode方法
          insertNode(node.left, newNode)
        } else { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)不存在,則將新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)
          node.left = newNode
        }
      } else { // 如果新節(jié)點(diǎn)的key值大于原來(lái)節(jié)點(diǎn)的key值,則作為原節(jié)點(diǎn)的右節(jié)點(diǎn)加入
        if (node.right) {
          insertNode(node.right, newNode)
        } else {
          node.right = newNode
        }
      }
    }
    
    this.insert = function(key){
        let newNode = new Node(key)  // 插入節(jié)點(diǎn)時(shí)創(chuàng)建一個(gè)Node對(duì)象來(lái)保存節(jié)點(diǎn)的數(shù)據(jù)
      if (root) {
        insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過(guò)insertNode方法進(jìn)行插入
      } else {
        root = newNode  // 如果根結(jié)點(diǎn)為空,則把該節(jié)點(diǎn)作為根結(jié)點(diǎn)
      }
    }
}
3.3 構(gòu)建一個(gè)二叉樹(shù)
  let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13]
  let tree = new binaryTree()
  nodes.forEach(function (key) {
    tree.insert(key)
  })

至此,一個(gè)二叉樹(shù)構(gòu)建完畢

其實(shí),只要你了解了二叉樹(shù)的三個(gè)重要特點(diǎn),構(gòu)建一棵二叉樹(shù)是不是還是比較容易的呢?

可以將代碼復(fù)制到自己的文件中進(jìn)行單步調(diào)試,看看執(zhí)行的結(jié)果是不是和前面描述的二叉樹(shù)的特點(diǎn)相同。

感謝你的閱讀

完整代碼:

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節(jié)點(diǎn)值
        this.left = null    // 該節(jié)點(diǎn)的左節(jié)點(diǎn)
        this.right = null   // 該節(jié)點(diǎn)的右節(jié)點(diǎn)
    }
    let root = null         // 根結(jié)點(diǎn),初始值為null
    
    
    let insertNode = function(node, newNode){
        if (newNode.key < node.key) { // 如果新節(jié)點(diǎn)的key值小于原來(lái)節(jié)點(diǎn)的key值,則該新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)加入
        if (node.left) { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)已經(jīng)存在,則繼續(xù)執(zhí)行insertNode方法
          insertNode(node.left, newNode)
        } else { // 如果原節(jié)點(diǎn)的左節(jié)點(diǎn)不存在,則將新節(jié)點(diǎn)作為原節(jié)點(diǎn)的左節(jié)點(diǎn)
          node.left = newNode
        }
      } else { // 如果新節(jié)點(diǎn)的key值大于原來(lái)節(jié)點(diǎn)的key值,則作為原節(jié)點(diǎn)的右節(jié)點(diǎn)加入
        if (node.right) {
          insertNode(node.right, newNode)
        } else {
          node.right = newNode
        }
      }
    }
    
    this.insert = function(key){
        let newNode = new Node(key)  // 插入節(jié)點(diǎn)時(shí)創(chuàng)建一個(gè)Node對(duì)象來(lái)保存節(jié)點(diǎn)的數(shù)據(jù)
      if (root) {
        insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過(guò)insertNode方法進(jìn)行插入
      } else {
        root = newNode  // 如果根結(jié)點(diǎn)為空,則把該節(jié)點(diǎn)作為根結(jié)點(diǎn)
      }
    }
}

let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13]
  let tree = new binaryTree()
  nodes.forEach(function (key) {
    tree.insert(key)
  })

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/106375.html

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)算法:叉樹(shù)算法

    摘要:因此,根據(jù)題目給出的先序遍歷和中序遍歷,可以畫(huà)出二叉樹(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畫(huà)的tree https://codepen...

    Little_XM 評(píng)論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)算法之美 - 非線(xiàn)性表中的樹(shù)、堆是干嘛用的 ?其數(shù)據(jù)結(jié)構(gòu)是怎樣的 ?

    摘要:筆者寫(xiě)的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語(yǔ)言是,旨在入門(mén)數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。非線(xiàn)性表中的樹(shù)堆是干嘛用的其數(shù)據(jù)結(jié)構(gòu)是怎樣的希望大家?guī)е@兩個(gè)問(wèn)題閱讀下文。其中,前中后序,表示的是節(jié)點(diǎn)與它的左右子樹(shù)節(jié)點(diǎn)遍歷訪(fǎng)問(wèn)的先后順序。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,...

    singerye 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)算法(四):二叉搜索樹(shù)

    摘要:像剛才的這幅圖,就是二叉搜索樹(shù)。而我們本文要學(xué)習(xí)的內(nèi)容,就是如何寫(xiě)一個(gè)二叉搜索樹(shù)。但在二叉搜索樹(shù)中,我們把節(jié)點(diǎn)成為鍵,這是術(shù)語(yǔ)。前端路漫漫,且行且歌的前端樂(lè)園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法四二叉搜索樹(shù) 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)...

    ingood 評(píng)論0 收藏0
  • JavaScript算法二叉搜索樹(shù)

    摘要:二叉搜索樹(shù)的特性二叉搜索樹(shù)由于其獨(dú)特的數(shù)據(jù)結(jié)構(gòu),使得其無(wú)論在增刪,還是查找,時(shí)間復(fù)雜度都是,為二叉樹(shù)的高度。二叉搜索樹(shù)的查找查找很簡(jiǎn)單,根據(jù)左子節(jié)點(diǎn)比該節(jié)點(diǎn)小,右子節(jié)點(diǎn)比該節(jié)點(diǎn)大的原則進(jìn)行循環(huán)判斷即可。 什么是二叉樹(shù) 二叉樹(shù)就是樹(shù)的每個(gè)節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn) 什么是二叉搜索樹(shù) 二叉搜索樹(shù)在二叉樹(shù)的基礎(chǔ)上,多了一個(gè)條件,就是二叉樹(shù)在插入值時(shí),若插入值比當(dāng)前節(jié)點(diǎn)小,就插入到左節(jié)點(diǎn),否則插...

    khlbat 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)算法(樹(shù)) --javascript語(yǔ)言描述

    摘要:重建二叉樹(shù)輸入某二叉樹(shù)的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹(shù)。所以先通過(guò)前序遍歷找出根節(jié)點(diǎn),然后將中序遍歷分為左右子樹(shù)兩組,最后對(duì)于每個(gè)子樹(shù)依次遞歸調(diào)用。 重建二叉樹(shù) 輸入某二叉樹(shù)的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹(shù)。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}...

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

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

0條評(píng)論

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