JavaScript的數據結構和算法

全部JavaScript對象都有hasOwnProperty(value)的方法,用來返回一個代表對象是否是具備這個value Key值屬性的布爾值。java

javaScript的方法 具備delete的方法 事實上在業務中不多去刪除真實的數據,可是在作一下添加和刪除時 爲了配合後端 也是會用到的。node

 在javaScript中咱們一般使用數據結構是對象和數組, 更經常使用的是鏈表結構,添加和刪除方便,不須要去遍歷。這是一個很節省性能的事情。算法

  new.target 是一個新增的管理 實例函數的方法  若是這個函數被new 或者繼承調用 那麼就會被返回當前的class或者function 不然返回一個undefined 須要些在constructor裏。後端

 set類 在JavaScript中體現爲集合的形式 相似對象不一樣於對象只能一組一組的保存,是能夠多組進行保存的類比其餘的語言set類 它算是比較完善的了,set類的結構 相似{1:1,2:2} 以key:value的形式保存起來。 咱們能夠使用它用來求交集,並集,差集,子集等等 相似於對象因此咱們能夠使用delete 來它其中的某一項,獲取它的長度能夠經過 用Object.keys來枚舉它拿到這個數組的length。添加能夠使用其本身本省所帶的add的方法。檢測是否有這個屬性key 咱們能夠使用hasOwnProperty()的方法來確認這個屬性。 這裏的集合存儲的是一組互不相同的元素.(也就是說這裏不適用多重集)。數組

 散列表和字典結構 在JavaScript中體現爲Map類。顧名思義 主要是爲了作映射使用。用來存儲惟一的值,結構也是使用key: value的形式。數據結構

 非順序數據結構有散列法和樹。函數

一個樹的結構包含一系列的父子關係的節點。每一個節點都有一個父節點(除了頂部的第一個節點)以及零個或多個子節點。性能

 

 (這裏圖的第二層8是錯誤的 應該是5)this

   位於樹頂部的節點叫作根節點。它沒有父節點。樹種的每一個元素都叫作節點。節點分爲內部節點和外部節點。 至少有一個字節點的節點稱爲內部節點(7,5,9,15,13,20是內部節點).沒有子元素的節點稱爲外部節點或葉節點(3,6,8,10,12,14,18,25都是葉節點)。spa

 一個節點能夠有祖先和後代。一個節點(除了根節點)的祖先包括父節點,祖父節點,曾祖父節點等等一個節點的後代包括它下面的全部節點。如圖上節點9的祖先節點有7和11,而他的字節點有8和10.

  有關於樹的另外一個術語是子樹。子樹由節點和它的後代構成。好比節點13和12,14構成了圖中的子樹。

  節點的一個屬性是深度,節點的深度取決於它的祖先節點的數量。好比,節點10有3個祖先節點(9,7,11),那麼它的深度就是3.

 樹的高度取決於全部節點深度的最大值。一棵樹也能夠被分解成層級。根節點在第0層,它的字節點在第一層。

 二叉樹和二叉搜索樹

二叉樹的節點最多隻能有兩個子節點:一個是左側子節點,另外一個是右側的子節點。這些定義有助於咱們寫出更高效的向/從樹中插入,查找和刪除節點的算法。

 上圖就是一個二叉搜索樹(BST)。屬於二叉樹的一種。

  如何用代碼去申明一個二叉搜索樹。

  首先定義一個function BinarySearchTree類。

   首先:  咱們先明確二叉搜索樹.

class BinarySearchTree {
  consturtor() {
     this.Node = class {
consturtor(key){
 
this.key = key; //這是咱們的節點值 變量私有化
this.left = null ; // 根節點起始左位置的初始化
this.right = null; // 根節點起始右位置的初始化
    }
}
this.root = null ; //起始的根節點
}
}

和鏈表同樣,都是經過指針來表示節點之間的關係(術語稱爲邊)。在雙向鏈表中,每一個節點都包含兩個指針,一個指向下一個節點,一個指向上一個節點。對於樹,使用一樣的方式(也使用兩個指針) 

     class BinarySearchTree {
        constructor() {
          this.Node = class {
            constructor(key){
             this.key = key; //這是咱們的節點值 變量私有化
              this.left = null ; // 根節點起始左位置的初始化
              this.right = null; // 根節點起始右位置的初始化
          }
          }
          this.root = null ; //起始的根節點
        }
        insert(key) {
          const newNode = new this.Node(key);
          if (this.root === null) {
            this.root = newNode;
          } else {
            this.insertNode(this.root, newNode);
          }
        }
        insertNode(node, newNode) { // 尾遞歸查詢節點 if (newNode.key < node.key) { //若是新的節點值小於父節點的值
            if (node.left === null) {
              node.left = newNode;
            } else {
              this.insertNode(node.left, newNode);
            }
          } else {
            if (node.right === null) {
              node.right = newNode;
            } else {
              this.insertNode(node.right, newNode);
            }
          }
        }
      }
       const BinarySearchTree1 = new BinarySearchTree();
       BinarySearchTree1.insert(11);
       BinarySearchTree1.insert(7);
       BinarySearchTree1.insert(15);
       BinarySearchTree1.insert(5);
       BinarySearchTree1.insert(3);
       BinarySearchTree1.insert(9);
       BinarySearchTree1.insert(8);
       BinarySearchTree1.insert(10);
       BinarySearchTree1.insert(13);
       BinarySearchTree1.insert(12);
       BinarySearchTree1.insert(14);
       BinarySearchTree1.insert(20);
       BinarySearchTree1.insert(18);
       BinarySearchTree1.insert(25);
       console.log(BinarySearchTree1);

這樣咱們就實現了 插入的方法。

這就是咱們獲得的二叉樹。

樹的遍歷分爲三種 中序遍歷 先序遍歷 後序遍歷

 中序遍歷是一種以上行順序的訪問的BST全部節點的遍歷方式,也就是以從最小到最大的順序訪問全部節點。中序遍歷的一種應用就是對樹進行排序操做。

      class BinarySearchTree {
        constructor() {
          this.Node = class {
            constructor(key){
             this.key = key; //這是咱們的節點值 變量私有化
              this.left = null ; // 節點起始左位置的初始化
              this.right = null; // 節點起始右位置的初始化
          }
          }
          this.root = null ; //起始的根節點
        }
        insert(key) {
          const newNode = new this.Node(key);
          if (this.root === null) {
            this.root = newNode;
          } else {
            this.insertNode(this.root, newNode);
          }
        }
        insertNode(node, newNode) {
          if (newNode.key < node.key) { //若是新的節點值小於父節點的值
            if (node.left === null) {
              node.left = newNode;
            } else {
              this.insertNode(node.left, newNode);
            }
          } else {
            if (node.right === null) {
              node.right = newNode;
            } else {
              this.insertNode(node.right, newNode);
            }
          }
        }
        inOrderTraverseNode(node, callback) {
          if (node !== null) { //{2}
            this.inOrderTraverseNode(node.left, callback); //{3}
            callback(node.key); //{4}
            this.inOrderTraverseNode(node.right, callback); //{5}
          } 
        }
        inOrderTraverse(callback) {
          this.inOrderTraverseNode(this.root, callback);
        }
        printNode(value) {
          console.log(value);
        }
      }
       const BinarySearchTree1 = new BinarySearchTree();
       BinarySearchTree1.insert(11);
       BinarySearchTree1.insert(7);
       BinarySearchTree1.insert(15);
       BinarySearchTree1.insert(5);
       BinarySearchTree1.insert(3);
       BinarySearchTree1.insert(9);
       BinarySearchTree1.insert(8);
       BinarySearchTree1.insert(10);
       BinarySearchTree1.insert(13);
       BinarySearchTree1.insert(12);
       BinarySearchTree1.insert(14);
       BinarySearchTree1.insert(20);
       BinarySearchTree1.insert(18);
       BinarySearchTree1.insert(25);
       BinarySearchTree1.inOrderTraverse(BinarySearchTree1.printNode);
       console.log(BinarySearchTree1);

搜索樹中的值

在樹中, 有三種常常執行的搜索類型:

最小值;

最大值;

搜索特定的值。

搜索最小值和最大值

  

相關文章
相關標籤/搜索