javascript實現二叉樹的代碼,javascript二叉樹

來源:互聯網
上載者:User

javascript實現二叉樹的代碼,javascript二叉樹

前言:

二叉樹的特點(例圖只是二叉樹的一種情況,不要嘗試使用案例圖推理以下結論)

  1. 除了最下面一層,每個節點都是父節點,每個節點都有且最多有兩個子節點;
  2. 除了嘴上面一層,每個節點是子節點,每個節點都會有一個父節點;
  3. 最上面一層的節點(即例圖中的節點50)為根節點;

最下面一層的節點稱為葉子節點,他們沒有子節點;

左子節點的值 < 父節點的值 <= 右節點的值

1 節點的javascript實現

// 節點對象function Node(data, left, right) {  this.data = data; // 節點值  this.left = left; // 當前節點的左子節點  this.right = right; // 當前節點的右子節點  this.show = show; // 輔助function}function show() {  return this.data;}

感受下上面實現節點的代碼,感覺和鏈表有點相似不是嗎,存著當前值,又存著下個節點(左、右子節點)的引用,下面是一張虛擬碼的草圖:

2 二叉樹的實現

實現二叉樹,當然就是要插入節點構成二叉樹,先看看實現二叉樹的js代碼

function BST() {  this.root = null;  this.insert = insert;}function insert(data) {  var n = new Node(data, null, null);  if (this.root == null) {   this.root = n;  }  else {   var current = this.root;   var parent;   while (true) {     parent = current;     if (data < current.data) {      current = current.left;      if (current == null) {        parent.left = n;        break;      }     }     else {      current = current.right;      if (current == null) {        parent.right = n;        break;      }     }   }  }}

然後是看一下虛擬碼:

function BST() {  this.root = null; // 根節點  this.insert = insert;}function insert(data) {  // 初始化一個節點,為什麼要將左右子節點的引用初始化為空白呢,因為可能是葉子節點,加入他有子節點,會在下面的代碼添加  var n = new Node(data, null, null);  if (該二叉樹是否為空白,是空則根節點為空白,因此可以用根節點判斷二叉樹是否為空白) {   // 將當前節點存為根節點   this.root = n;  }  else {   // 來到這裡就表示,該二叉樹不為空白,這裡關鍵的是兩句代碼:   // 0.while (true);   // 1.parent = current;   // 2.current = current.left;/current = current.right;   // 3.break;   var current = this.root;   var parent;   while (true) {     parent = current; // 獲得父節點,第一次迴圈,那麼父節點就是根節點     if (data < current.data) { // 當前節點值小於父節點的值就是存左邊,記得二叉樹的特點吧,如果真是小於父節點,那麼就說明該節點屬於,該父節點的左子樹。      current = current.left;      if (current == null) {        parent.left = n;        break;      }      // 其實上面這樣寫不好理解,可以等價於下面的代碼:      // start      if(current.left == null){ // 若果左節點空,那麼這個空的節點就是我們要插入的位置        current.left = n;        break;      }else{        // 不空則繼續往下一層找空節點(插入的位置)        current = current.left;      }      // end     }     else {      // 右節點的邏輯代碼個左節點的一樣的      current = current.right;      if (current == null) {        parent.right = n;        break;      }     }   }  }}

下面是一個更好理解的插入函數

function insert(data) {  var n = new Node(data, null, null);  if (this.root == null) {   this.root = n;  }  else {   var current = this.root;   // start change   while (true) {     if (data < current.data) {      if (current.left == null) {        current.left = n;        break;      }else{        current = current.left;      }     }else {      if (current.right == null) {        current.right = n;        break;      }else{        current = current.right;      }     }   }  }}

小結:

二叉樹的實現的三個組件

Node對象

function Node(data, left, right) { ... }

BST對象

function BST() { ... }

插入節點函數

function insert(data) { ... }

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.