成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

我對JS樹的簡單學習

legendmohe / 2578人閱讀

摘要:二叉搜索樹這一數(shù)據(jù)結(jié)構(gòu)綜合了以上兩種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點。上圖就展示了一個二叉搜索樹。實現(xiàn)二叉樹的算法大部分都有遞歸。

一種非順序數(shù)據(jù)結(jié)構(gòu)-樹,它對于存儲需要快速查找的數(shù)據(jù)非常有用

相關(guān)概念:

根節(jié)點:位于樹頂部的節(jié)點,沒有父節(jié)點

內(nèi)部節(jié)點:至少有一個子節(jié)點的節(jié)點(7,5,9,15,13,20)

外部節(jié)點(葉節(jié)點):沒有子元素的節(jié)點(第3層)

子樹:由節(jié)點和它的后代構(gòu)成(節(jié)點13,12,14構(gòu)成了一個子樹)

深度:節(jié)點的深度取決于它的祖先節(jié)點的數(shù)量

高度:取決于所有節(jié)點深度的最大值

二叉搜索樹(BST)

無序鏈表在插入時候具有較高的靈敏性,而有序數(shù)組在查找的時候具有較高的效率。

二叉搜索樹(BST)這一數(shù)據(jù)結(jié)構(gòu)綜合了以上兩種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點。但是它只允許你在左側(cè)節(jié)點存儲(比父節(jié)點)小的值,右側(cè)節(jié)點存儲(比父節(jié)點)大的值。

上圖就展示了一個二叉搜索樹。實現(xiàn)二叉樹的算法大部分都有遞歸。

創(chuàng)建一個BinarySearchTree類

function BinarySearchTree () {
  var Node = function () {
    this.key = key; // 鍵
    this.left = null; // 指針指向左側(cè)子節(jié)點
    this.right = null; // 指針指向右側(cè)子節(jié)點
  };
  var root = null;
}

var tree = new BinarySearchTree();

實現(xiàn)insert(key)方法,插入一個鍵

this.insert = function (key) {
  var newNode = new Node(kye); // 創(chuàng)建用來表示新節(jié)點的Node類實例,
  if (root === null) { // 如果插入的節(jié)點是樹第一個節(jié)點
    root = newNode;
  } else {
    insertNode(root, newNode); // 私有的輔助函數(shù)
  }
}

tree.insert();

私有的輔助函數(shù)

var insertNode = function (node, newNode) { // 從根節(jié)點開始
  if (newNode.key < node.key) { // 判斷左側(cè),遍歷左側(cè)
    if (node.left === null) { // 如果子節(jié)點為空,就在子節(jié)點添加新節(jié)點
      node.left = newNode;
    } else {
      insertNode(node.left, newNode); // 往下遞歸
    }
  } else { // 判斷右側(cè),遍歷右側(cè)
    if (node.right === null) {
      node.right = newNode;
    } else {
      insertNode(node.right, newNode);
    }
  }
}
二叉樹的遍歷

前序遍歷:根節(jié)點->左子樹->右子樹

中序遍歷:左子樹->根節(jié)點->右子樹

后序遍歷:左子樹->右子樹->根節(jié)點

對下面的樹進行遍歷

前序遍歷:abdefgc

中序遍歷:debgfac

后序遍歷:edgfbca

中序遍歷:一種應(yīng)用是對樹進行排序操作

this.inOrderTraverse = function {callback} {
  inOrderTraverse(root, callback); // 回調(diào)函數(shù)用來處理遍歷到的每個節(jié)點
};
var inOrderTraverseNode = function (node, callback) {
  if (node !== null) {
    inOrderTraverseNode(node.left, callback);
    callback(node.key);
    inOrderTraverseNode(node.right, callback);
  }
}

先序遍歷:一種應(yīng)用是打印一個結(jié)構(gòu)化的文檔

this.preOrderTraverse = function (callback) {
  preOrderTraverseNode(root, callback);
}

var preOrderTraverseNode = function (node, callback) {
  if (node !== null) {
    callback(node.key);
    preOrderTraverseNode(node.left, callback);
    preOrderTraverseNode(node.right, callback);
  }
}

后序遍歷:一種應(yīng)用是計算一個目錄和它的子目錄中所有文件所占的空間大小。

this.postOrderTraverse = function (callback) {
  postOrderTraverse(root, callback);
}

var postOrderTraverse = function (callback) {
  if (node !== null) {
    postOrderTraverse(node.left, callback);
    postOrderTraverse(node.right, callback);
    callback(node.key);
  }
}
搜索樹中的值

對于尋找最小值,總是沿著樹的左邊;對于尋找最大值,總是沿著樹的右邊

尋找樹中的最小鍵

this.min = function () {
  return minNode(root);
}

var minNode = function (node) {
  if (node) {
    while (node && node.left !== null) {
      node = node.left;
    }
    return node.key;
  }
  return null;
}

尋找一個特定的值

this.search = function (key) {
  return searchNode(root, key);
}

var searchNode = function (node, kye) {
  if (node === null) { // node有效性檢查
    return false;
  }
  if (key < node.key) { // 比當前節(jié)點小,當前節(jié)點的左側(cè)子樹搜索
    return searchNode(node.left, key);
  } else if (key > node.key) { // 比當前節(jié)點大,當前節(jié)點的右側(cè)子樹搜索
    return searchNode(node.right, key);
  } else { // 要找的鍵就是當前節(jié)點
    return true;
  }
}
移除一個節(jié)點
this.remove = function (key) {
  root = removeNode (root, key);
}

var removeNode = function (node, key) {
  if (node === null) { // 鍵不存在于樹中
    return null;
  }
  if (key < node.key) {
    node.left = removeNode(node.left, key);
    return node;
  } else if (key > node.key) {
    node.right = removeNode(node.right, key);
    return node;
  } else {
    if (node.left === null && node.right === null) { // 一個葉節(jié)點
      node = null;
      return node;
    }
    if (node.left === null) { // 一個只有一個子節(jié)點的節(jié)點 
      node = node.right;
      return node;
    } else if (node.right === null) {
      node = node.left;
      return node;
    }

    // 一個有兩個子節(jié)點的節(jié)點
    var aux = findMinNode(node.right);
    node.key = aux.key;
    node.right = removeNode(node.right, aux.key);
    return node;
  }
}

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/82448.html

相關(guān)文章

  • JavaScript算法之二叉搜索樹

    摘要:二叉搜索樹的特性二叉搜索樹由于其獨特的數(shù)據(jù)結(jié)構(gòu),使得其無論在增刪,還是查找,時間復(fù)雜度都是,為二叉樹的高度。二叉搜索樹的查找查找很簡單,根據(jù)左子節(jié)點比該節(jié)點小,右子節(jié)點比該節(jié)點大的原則進行循環(huán)判斷即可。 什么是二叉樹 二叉樹就是樹的每個節(jié)點最多只能有兩個子節(jié)點 什么是二叉搜索樹 二叉搜索樹在二叉樹的基礎(chǔ)上,多了一個條件,就是二叉樹在插入值時,若插入值比當前節(jié)點小,就插入到左節(jié)點,否則插...

    khlbat 評論0 收藏0
  • 我對JS字典的簡單學習

    摘要:我對字典的簡單學習字典的概念集合字典和散列表都可以來存儲不重復(fù)的值。字典也被稱為映射。中有集合類的實現(xiàn),也有字典類的實現(xiàn)。相關(guān)操作方法實現(xiàn)方法,判斷某個鍵值是否在這個字典中,有則返回。實現(xiàn)方法,將字典所有的值以數(shù)組的形式返回。 我對JS字典的簡單學習 字典的概念 集合、字典和散列表都可以來存儲不重復(fù)的值。在集合中我們使用[值,值]來保存,在字典和散列表中使用[鍵,值]來存儲數(shù)據(jù)。 字典...

    CntChen 評論0 收藏0
  • 我對JS棧的簡單學習

    摘要:我對棧的學習因為是個新手,所以都是最簡單的知識學習梳理。棧是一種遵從后進先出原則的有序集合,新添加的或者待刪除的元素都保留在棧的末尾,稱作棧頂,另一端叫做棧底。棧的學習棧的創(chuàng)建創(chuàng)建一個類來表示棧。對于棧來說只能用和方法來進行添加和刪除元素。 我對棧的學習 因為是個新手,所以都是最簡單的知識學習梳理。 什么是棧 數(shù)組是計算機科學中最常用的數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)元素的集合。有時候我們需要一種添加...

    Cobub 評論0 收藏0

發(fā)表評論

0條評論

legendmohe

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<