成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

shengguo / 2951人閱讀

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

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

1、樹

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

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

一個節(jié)點可以有多個子節(jié)點

2、二叉樹

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

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

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

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

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

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

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

二叉樹有一個父節(jié)點和左右兩個子節(jié)點;

每個節(jié)點有一個值,稱為節(jié)點值;

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

明白了這三點,我們就可以開始寫代碼了

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

3.1 創(chuàng)建一個二叉樹對象

創(chuàng)建一個二叉樹對象,定義一個對象來保存節(jié)點的值和其子節(jié)點

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

在binaryTree中創(chuàng)建一個insert方法,通過insert方法向樹中添加新節(jié)點

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

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

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

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

感謝你的閱讀

完整代碼:

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

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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

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

相關(guān)文章

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

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

    Little_XM 評論0 收藏0
  • JavaScript 數(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)是怎樣的希望大家?guī)е@兩個問題閱讀下文。其中,前中后序,表示的是節(jié)點與它的左右子樹節(jié)點遍歷訪問的先后順序。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 想學好前端,先練好內(nèi)功,內(nèi)功不行,...

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

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

    ingood 評論0 收藏0
  • JavaScript算法二叉搜索樹

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

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

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

    henry14 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<