Javascript 數據結構與算法——二叉樹

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

一、樹

一棵樹最上面的節點:根結點函數

一個節點下面鏈接多個節點,那個這個節點稱「爲父節點」,它下面的節點稱爲「子節點」,沒有任何子節點的節點稱爲「葉子節點」。this

一個節點能夠有多個子節點調試

二、二叉樹

二叉樹是一種特殊的樹,子節點數不超過「2個」。code

以某種特定的順序訪問樹中全部的節點稱爲樹的遍歷對象

樹的層數稱爲「樹的深度排序

一個父節點的兩個子節點分別稱爲「左節點」和「右節點get

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

三、js構建以一顆二叉樹

用代碼構建二叉樹前,先要在腦中不斷的重複二叉樹的重要特色:function

  1. 二叉樹有一個父節點和左右兩個子節點;
  2. 每一個節點有一個值,稱爲節點值;
  3. 左節點的值小於父節點的值,右節點的值大於父節點值。

明白了這三點,咱們就能夠開始寫代碼了

構建二叉樹的完整代碼請看文末

3.1 建立一個二叉樹對象

建立一個二叉樹對象,定義一個對象來保存節點的值和其子節點

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節點值
        this.left = null    // 該節點的左節點
        this.right = null   // 該節點的右節點
    }
    let root = null         // 根結點,初始值爲null
}

3.2 建立一個構建二叉樹的函數

在binaryTree中建立一個insert方法,經過insert方法向樹中添加新節點

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節點值
        this.left = null    // 該節點的左節點
        this.right = null   // 該節點的右節點
    }
    let root = null         // 根結點,初始值爲null
    
    
    let insertNode = function(node, newNode){
        if (newNode.key < node.key) { // 若是新節點的key值小於原來節點的key值,則該新節點做爲原節點的左節點加入
        if (node.left) { // 若是原節點的左節點已經存在,則繼續執行insertNode方法
          insertNode(node.left, newNode)
        } else { // 若是原節點的左節點不存在,則將新節點做爲原節點的左節點
          node.left = newNode
        }
      } else { // 若是新節點的key值大於原來節點的key值,則做爲原節點的右節點加入
        if (node.right) {
          insertNode(node.right, newNode)
        } else {
          node.right = newNode
        }
      }
    }
    
    this.insert = function(key){
        let newNode = new Node(key)  // 插入節點時建立一個Node對象來保存節點的數據
      if (root) {
        insertNode(root, newNode) // 若是根結點已經存在,則經過insertNode方法進行插入
      } else {
        root = newNode  // 若是根結點爲空,則把該節點做爲根結點
      }
    }
}

3.3 構建一個二叉樹

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

至此,一個二叉樹構建完畢

其實,只要你瞭解了二叉樹的三個重要特色,構建一棵二叉樹是否是仍是比較容易的呢?

能夠將代碼複製到本身的文件中進行單步調試,看看執行的結果是否是和前面描述的二叉樹的特色相同。

感謝你的閱讀

完整代碼:

function binaryTree(){
    let Node = function (key){
        this.key = key      // 節點值
        this.left = null    // 該節點的左節點
        this.right = null   // 該節點的右節點
    }
    let root = null         // 根結點,初始值爲null
    
    
    let insertNode = function(node, newNode){
        if (newNode.key < node.key) { // 若是新節點的key值小於原來節點的key值,則該新節點做爲原節點的左節點加入
        if (node.left) { // 若是原節點的左節點已經存在,則繼續執行insertNode方法
          insertNode(node.left, newNode)
        } else { // 若是原節點的左節點不存在,則將新節點做爲原節點的左節點
          node.left = newNode
        }
      } else { // 若是新節點的key值大於原來節點的key值,則做爲原節點的右節點加入
        if (node.right) {
          insertNode(node.right, newNode)
        } else {
          node.right = newNode
        }
      }
    }
    
    this.insert = function(key){
        let newNode = new Node(key)  // 插入節點時建立一個Node對象來保存節點的數據
      if (root) {
        insertNode(root, newNode) // 若是根結點已經存在,則經過insertNode方法進行插入
      } else {
        root = newNode  // 若是根結點爲空,則把該節點做爲根結點
      }
    }
}

let nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13]
  let tree = new binaryTree()
  nodes.forEach(function (key) {
    tree.insert(key)
  })
相關文章
相關標籤/搜索