成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

shengguo / 2909人閱讀

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

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

1、樹

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

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

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

2、二叉樹

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

以某種特定的順序訪問樹中所有的節(jié)點(diǎn)稱為樹的遍歷

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

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

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

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

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

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

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

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

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

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

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

創(chuàng)建一個(gè)二叉樹對(duì)象,定義一個(gè)對(duì)象來保存節(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ù)

在binaryTree中創(chuàng)建一個(gè)insert方法,通過insert方法向樹中添加新節(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值小于原來節(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值大于原來節(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ì)象來保存節(jié)點(diǎn)的數(shù)據(jù)
      if (root) {
        insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過insertNode方法進(jìn)行插入
      } else {
        root = newNode  // 如果根結(jié)點(diǎn)為空,則把該節(jié)點(diǎn)作為根結(jié)點(diǎn)
      }
    }
}
3.3 構(gòu)建一個(gè)二叉樹
  let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13]
  let tree = new binaryTree()
  nodes.forEach(function (key) {
    tree.insert(key)
  })

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

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

可以將代碼復(fù)制到自己的文件中進(jìn)行單步調(diào)試,看看執(zhí)行的結(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值小于原來節(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值大于原來節(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ì)象來保存節(jié)點(diǎn)的數(shù)據(jù)
      if (root) {
        insertNode(root, newNode) // 如果根結(jié)點(diǎn)已經(jīng)存在,則通過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://systransis.cn/yun/106375.html

相關(guān)文章

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

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

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

    摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。非線性表中的樹堆是干嘛用的其數(shù)據(jù)結(jié)構(gòu)是怎樣的希望大家?guī)е@兩個(gè)問題閱讀下文。其中,前中后序,表示的是節(jié)點(diǎn)與它的左右子樹節(jié)點(diǎ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)算法(四):二叉搜索樹

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

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

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

    摘要:重建二叉樹輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。所以先通過前序遍歷找出根節(jié)點(diǎn),然后將中序遍歷分為左右子樹兩組,最后對(duì)于每個(gè)子樹依次遞歸調(diào)用。 重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)重建出該二叉樹。假設(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元查看
<