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

資訊專欄INFORMATION COLUMN

JS 實(shí)現(xiàn) 二叉樹

Yu_Huang / 730人閱讀

摘要:二叉樹定義二叉排序樹二叉平衡樹二叉樹定義二叉樹是每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支不存在分支度大于的節(jié)點(diǎn)的樹結(jié)構(gòu)。通常分支被稱為左子樹和右子樹。二叉樹的分支具有左右次序,不能顛倒。

① 二叉樹定義
② 二叉排序樹
③ 二叉平衡樹

① 二叉樹定義

二叉樹(Binary tree)是每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支(不存在分支度大于2的節(jié)點(diǎn))的樹結(jié)構(gòu)。通常分支被稱為「左子樹」和「右子樹」。二叉樹的分支具有左右次序,不能顛倒。

② 二叉排序樹

簡單定義
二叉排序樹 又稱為 二叉搜索樹或二叉查找樹
特征
(1) 若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值
(2) 若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值
(3) 它的左、右子樹也分別為二叉查找樹
Javascript實(shí)現(xiàn)

function BinarySearchTree(keys){
  //Node構(gòu)造函數(shù)
  let Node = function (key){
     this.key = key
     this.left = null
     this.right = null
  }
  let root = null
  let insertNode = (node,newNode)=>{
     if(newNode.key < node.key){
       if(node.left === null){
         node.left = newNode
       }else {
         insertNode(node.left,newNode)
       }
     }else {
       if (node.right === null) {
         node.right = newNode
       }else {
         insertNode(node.right,newNode)
       }
     }
  }
  this.insert = (key)=>{
     let newNode = new Node(key)
     if (root === null) {
       root = newNode
     }else {
       insertNode(root,newNode)
     }
  }
  keys.forEach((key)=>{
   this.insert(key)
  })
  return root
}
const keys = [8,3,10,1,6,14,4,7,13]
BinarySearchTree(keys)

chrome中打印如下:

效果圖:

中序遍歷
中序遍歷的遞歸定義:先左子樹,后根節(jié)點(diǎn),再右子樹

let inOrderTraverseFunction =(node,cb)=>{
   if(node!==null){
      inOrderTraverseFunction(node.left,cb)
      cb(node.key)
      inOrderTraverseFunction(node.right,cb)
   }
} 
let callback =(key)=>{
  console.log(key)
}
//BST的中序遍歷
inOrderTraverseFunction(BinarySearchTree(keys),callback)

chrome中打印如下:

結(jié)果:整顆二叉樹節(jié)點(diǎn)以從小到大依次顯示

前序遍歷
前序遍歷的遞歸定義:先根節(jié)點(diǎn),后左子樹,再右子樹

let preOrderTraverseFunction =(node,cb)=>{
   if(node!==null){
      cb(node.key)
      preOrderTraverseFunction(node.left,cb)
      preOrderTraverseFunction(node.right,cb)
   }
} 
//BST前序遍歷
preOrderTraverseFunction(BinarySearchTree(keys),callback)

chrome打印如下

后序遍歷
后序遍歷的遞歸定義:先左子樹,后右子樹,再根節(jié)點(diǎn)

let postOrderTraverseFunction =(node,cb)=>{
   if(node!==null){
      postOrderTraverseFunction(node.left,cb)
      postOrderTraverseFunction(node.right,cb)
      cb(node.key)
   }
} 
//BST后序遍歷
postOrderTraverseFunction(BinarySearchTree(keys),callback)

chrome打印如下

查找BST最小值
白話:即二叉樹左子樹最左側(cè)的那個(gè)沒有左子樹的節(jié)點(diǎn)

let minNode =(node)=>{
  if(node){
    while (node&&node.left !== null){
       node = node.left
    }
    return node.key
  }
  return null
}
//查找BST最小值
console.log("the min node is "+minNode(BinarySearchTree(keys)))

chrome打印如下

查找BST最大值
白話:即二叉樹右子樹最右側(cè)的那個(gè)沒有右子樹的節(jié)點(diǎn)

let maxNode =(node)=>{
  if(node){
    while (node&&node.right !== null){
       node = node.right
    }
    return node.key
  }
  return null
}
//查找BST最大值
console.log("the max node is "+maxNode(BinarySearchTree(keys)))

chrome打印如下

查找BST某個(gè)值
即將該值和每個(gè)節(jié)點(diǎn)比較 如果該值比此節(jié)點(diǎn)小 則進(jìn)入左子樹再遞歸比較 反之 如果該值比此節(jié)點(diǎn)大 則進(jìn)入右子樹再遞歸比較

let searchNode = (node,key)=>{
  if(node === null){
    return false   
  }
  if(keynode.key) {
    return searchNode(node.right,key)
  }else{
    return true
  }
}
//BST查找某個(gè)值
console.log(searchNode(BinarySearchTree(keys),3)?"node 3 is found":"node 3 is not found")
console.log(searchNode(BinarySearchTree(keys),5)?"node 5 is found":"node 5 is not found")

chrome打印如下:

刪除BST某個(gè)葉子節(jié)點(diǎn)
葉子節(jié)點(diǎn):沒有左子樹和右子樹的節(jié)點(diǎn)

let removeNode = (node,key)=>{
  if(node === null){
    return null
  }
  if(keynode.key){
    node.right = removeNode(node.right,key)
    return node
  } else{
    if(node.left === null && node.right === null){
      node = null
      return node
    }
  }
}
//BST刪除某個(gè)葉子節(jié)點(diǎn)
console.log(removeNode(BinarySearchTree(keys),1),BinarySearchTree(keys))

chrome打印如下:

效果圖:

刪除BST某個(gè)度為1的節(jié)點(diǎn)

let removeNode = (node,key)=>{
  if(node === null){
    return null
  }
  if(keynode.key){
    node.right = removeNode(node.right,key)
    return node
  } else{
    if(node.left === null && node.right === null){
      node = null
      return node
    }
    if(node.left === null){
      node = node.right
      return node
    }else if (node.right === null) {
      node = node.left
      return node     
    }
  }
}
//BST刪除某個(gè)度為1的子節(jié)點(diǎn)
console.log(removeNode(BinarySearchTree(keys),10),BinarySearchTree(keys))

chrome打印如下:

效果圖:

刪除BST某個(gè)度為2的節(jié)點(diǎn)

let findMinNode = (node) =>{
  if(node){
    while(node&& node.left !== null){
      node = node.left
    }
    return node 
  }
  return null
}
let removeNode = (node,key)=>{
  if(node === null){
    return null
  }
  if(keynode.key){
    node.right = removeNode(node.right,key)
    return node
  } else{
    if(node.left === null && node.right === null){
      node = null
      return node
    }
    if(node.left === null){
      node = node.right
      return node
    }else if (node.right === null) {
      node = node.left
      return node     
    }
    let minNode = findMinNode(node.right) 
    node.key = minNode.key
    node.right = removeNode(node.right,minNode.key)
    return node
  }
}
//BST刪除某個(gè)度為2的子節(jié)點(diǎn)
console.log(removeNode(BinarySearchTree(keys),3),BinarySearchTree(keys))

chrome打印如下:

效果圖:

未完待續(xù)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89704.html

相關(guān)文章

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

    摘要:同樣結(jié)點(diǎn)樹的二叉樹,完全二叉樹的深度最小。二叉樹每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域是比較自然的想法,我們稱這樣的鏈表叫做二叉鏈表。 二叉樹的概念 二叉樹(Binary Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(空二叉樹),或者由一個(gè)根結(jié)點(diǎn)和兩棵互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。 showImg(https://seg...

    DesGemini 評(píng)論0 收藏0
  • js叉樹的深度遍歷與廣度遍歷(遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn))

    摘要:樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度。二叉樹有深度遍歷和廣度遍歷,深度遍歷有前序中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來顯示目錄結(jié)構(gòu)等中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用后序遍歷可以用來實(shí)現(xiàn)計(jì)算目錄內(nèi)的文件及其信息等。 樹的簡介 棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。樹型結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關(guān)系定義的層次結(jié)...

    Yuanf 評(píng)論0 收藏0
  • JS實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)----排序叉樹

    摘要:代碼實(shí)現(xiàn)創(chuàng)建一個(gè)排序二叉樹節(jié)點(diǎn)類根節(jié)點(diǎn)插入節(jié)點(diǎn)以上便是創(chuàng)建排序二叉樹的實(shí)現(xiàn)方式重點(diǎn)在于插入節(jié)點(diǎn)的具體實(shí)現(xiàn),即注釋的代碼片段。 排序二叉樹 showImg(https://segmentfault.com/img/bVbfdbp?w=1047&h=472); 如上圖為典型的排序二叉樹,左孩子的值比節(jié)點(diǎn)的值小,右孩子的值比節(jié)點(diǎn)的值大,關(guān)于具體的樹的定義及二叉樹的定義可以百度或查閱相關(guān)資料。...

    ispring 評(píng)論0 收藏0
  • js數(shù)據(jù)結(jié)構(gòu)-叉樹二叉搜索樹)

    摘要:前言可能有一部分人沒有讀過我上一篇寫的二叉堆,所以這里把二叉樹的基本概念復(fù)制過來了,如果讀過的人可以忽略前面針對(duì)二叉樹基本概念的介紹,另外如果對(duì)鏈表數(shù)據(jù)結(jié)構(gòu)不清楚的最好先看一下本人之前寫的數(shù)據(jù)結(jié)構(gòu)鏈表二叉樹二叉樹是一種樹形結(jié)構(gòu),它的特點(diǎn)是 前言 可能有一部分人沒有讀過我上一篇寫的二叉堆,所以這里把二叉樹的基本概念復(fù)制過來了,如果讀過的人可以忽略前面針對(duì)二叉樹基本概念的介紹,另外如果對(duì)鏈...

    codeKK 評(píng)論0 收藏0
  • 叉樹的遞歸遍歷(JS實(shí)現(xiàn)

    摘要:本文討論二叉樹的遍歷,對(duì)節(jié)點(diǎn)的訪問通過打印節(jié)點(diǎn)的值體現(xiàn)出來。從二叉樹的根節(jié)點(diǎn)出發(fā),遍歷可分為三個(gè)環(huán)節(jié)訪問節(jié)點(diǎn)打印節(jié)點(diǎn)的值遍歷節(jié)點(diǎn)的左子樹遍歷節(jié)點(diǎn)的右子樹不同環(huán)節(jié)執(zhí)行的先后順序產(chǎn)生了不同的遍歷方式。至于二叉樹的非遞歸遍歷,且聽下回分解。 相關(guān)概念 「樹的遍歷」 指按照一定規(guī)則不重復(fù)地訪問樹中所有節(jié)點(diǎn)的過程?!冈L問」指針對(duì)節(jié)點(diǎn)的操作,如打印節(jié)點(diǎn)的值,更新節(jié)點(diǎn)的值等。 本文討論二叉樹的遍歷,...

    ethernet 評(píng)論0 收藏0
  • 叉樹js的生成

    摘要:二叉樹的生成二叉樹的概念二叉樹概念及相關(guān)操作本文是順序二叉樹及其操作的實(shí)現(xiàn),非順序二叉樹應(yīng)該也差不多,這里沒有實(shí)現(xiàn)基本二叉樹的實(shí)現(xiàn)添加元素查找元素刪除元素具體使用方法 二叉樹的js生成 二叉樹的概念二叉樹概念及相關(guān)操作 本文是順序二叉樹及其操作的js實(shí)現(xiàn),非順序二叉樹應(yīng)該也差不多,這里沒有實(shí)現(xiàn) //基本二叉樹的實(shí)現(xiàn) function BT(){ this.root=null; ...

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

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

0條評(píng)論

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