使用javascript實現排序二叉樹(1)

JinsongChai發表於2018-08-26

使用javascript實現排序二叉樹(1)

排序二叉樹的定義: 二叉樹的基礎上,左節點比父節點要小,右節點比父節點要大的二叉樹,叫排序二叉樹。

二叉排序樹示例

下面直接進入到我們的javascript程式碼 定義 排序二叉樹的過程

/*
    分析二叉樹的結構得出,二叉樹由節點構成,每個節點又有自己的左右子樹。
    並且有一個根節點
*/
function BinaryTree(){
  var root = null; //根節點預設為null
  /*
    1.節點型別的建構函式,預設左右子樹都為空
  */
  function Node(key){
    this.key = key;
    this.left = null;
    this.right = null;
  }
  /*
      2.根據排序二叉樹的規律,我們定義一個插入節點的方法,去填充排序二叉樹。該方法是BinaryTree的一個方法,需要繫結在this上讓其他呼叫者能呼叫。而不是作為內部方法。
  */
  this.insert = function(key){     
    var newNode = new Node(key);
    if(root === null){
       root = newNode;
    }else{
       insertNode(root,newNode)
    }
  }
  var insertNode = function(node,newNode){
    if(newNode.key < node.key){
      if(node.left === null){
         node.left = newNode;
      }else{
         insertNode(node.left,newNode)
      }
    }else{
      if(newNode.key > node.key){
        if(node.right === null){
          node.right = newNode;
        }else{
          insertNode(node.right,newNode)
        }
      }
    }
  }
}

/*
    測試:檢視是否報錯,具體的流程邏輯可以通過打斷點來判斷是否與自己設想的一樣。
                      8
                   7     9
                 3         12
               2   4
                     6
                   5
*/
var nodes = [8,7,3,4,6,5,2,9,12]
var binaryTree = new BinaryTree();
nodes.forEach((item)=>{
    binaryTree.insert(item)
})

測試得到的一個二叉排序樹

通過斷點除錯,最後得到的一個二叉樹應該是這樣的。也是符合二叉排序樹的定義的。

重點

  1. 分析資料結構的一個規律,從而能夠定義出節點型別中有哪些屬性
  2. 方法不要都繫結在 this 上面,因為有些函式是不需要暴露出去的,而是內部使用的。
  3. 我覺得讓我收穫比較大的是這裡的 insert 這個函式中又呼叫一個 insertNode 的函式,因為事實上真正的插入節點是需要兩個引數的,一個父節點,一個要插入的節點。所以會需要遞迴呼叫,如果不依靠 insertNode 直接用 insert方法 去遞迴是沒法遞迴的。因為外部壓根獲取不到 root 。之前還想著 只用 一個方法就實現插入遞迴 ,但是確實不行。

下期內容

  1. 實現排序二叉樹的 中序 前序 後續 遍歷
  2. 實現二叉樹的節點查詢功能
  3. 實現排序二叉樹的 刪除節點功能
  4. 應用排序二叉樹實現一個小遊戲

相關文章