js視角的數據結構和算法(三)

  • 棧是邏輯結構中線性結構中的一種,遵循先入後出的原則。
  • 最先入棧的元素稱爲棧底元素,最後入棧的元素稱爲棧頂元素。
  • 棧屬於邏輯結構,需要依託物理結構而存在。通過數組和鏈表,都可以實現一個棧。
  • 棧基本操作是入棧和出棧,只從某一側進行入或出,不論是鏈表實現還是數組實現,時間複雜度都是O(1)。
//入棧
var arr=[1,2,3,4]
arr.push(5)

//出棧
var arr=[1,2,3,4]
arr.pop()

隊列

  • 隊列也是邏輯結構中線性結構中的一種,遵循先入先出的原則。
  • 隊列就像排隊一樣,有隊頭(出口)和隊尾(入口)。
  • 隊列基本操作是入隊和出隊,只從某一側進行入或出,不論是鏈表實現還是數組實現,時間複雜度都是O(1)。
//入隊
var arr=[1,2,3,4]
arr.push(5)

//出隊
var arr=[1,2,3,4]
arr.shift()

棧和隊列的應用

先入後出的棧和先入先出的隊列在特點上決定了它們的不同應用場景。

  • 棧可用於歷史數據的獲取,是一種回溯,也能用於將遞歸操作轉換成基於棧的非遞歸。
  • 隊列就像它的名字一樣,用於排隊。瀏覽器的事件循環中的任務隊列就是按照事件註冊順序進行入隊和出隊。

之前提到的隊列,棧都屬於線性的邏輯結構,而實際上,還存在非線性的邏輯結構,樹就是其中一種。以學校爲例,下分各個院系,每個院系會有各個專業,每個專業會有各個班級,班級還會細分宿舍,每個宿舍是一個個學生,這就是一棵樹的結構。

常見術語

  • 根節點:樹根,如下圖A節點
  • 葉子節點:沒有孩子的末端節點,如下圖的#
  • 子樹:符合樹結構的子集,如下圖以B,C爲根的兩棵左右子樹
  • 父節點:當前節點的上一級節點,對B來說,A就是其父節點
  • 兄弟節點:同父節點且同級節點,如下圖的B,C
  • 孩子節點:當前節點的子節點,對B來說,D是孩子其節點
  • 樹的高度或深度:樹的最大層級,下圖的樹高度爲4

在這裏插入圖片描述

二叉樹

二叉樹是樹的一種特殊形式,也是樹結構中最常用的一種。它的結構就和名字那樣,每個節點最多兩個分支,但也可能一個,甚至沒有。二叉樹的左右節點被稱爲左孩子和右孩子,順序固定,上圖就是一個二叉樹的結構。當然,二叉樹還有滿二叉樹和完全二叉樹的結構,前者要求每個子節點的左右孩子都存在,後者只要求最後一個節點之前的都齊全。

在這裏插入圖片描述

二叉樹的實現

二叉樹是邏輯結構,需要依託物理結構存在,既可以用鏈表實現,也可以用數組實現。

鏈表實現

  • 每個節點分三個域,存儲數據data域,分別指向左右孩子的left指針域和right域

在這裏插入圖片描述

數組實現

  • 數組存儲會按照層級順序安放樹的各個節點,若某個孩子節點不存在,則數組在對應位置也空出來。
  • 以上圖二叉樹爲例
  • 這種存儲方式很方便查找,假如當前父節點索引爲index,那其左節點索引就是2index+1,右節點索引就是2index+2(不考慮下標越界)
  • 以A節點爲例,索引爲0,左節點索引爲2x0+1=1,arr[1]=“B”,右節點索引爲2x0+2,arr[2]=“C”
var arr=[];
arr[0]="A";
arr[1]="B";
arr[2]="C";
arr[3]="D";
arr[4]="E";
arr[5]="F";
arr[9]="G";
arr[12]="H";

二叉搜索樹/二叉查找樹/二叉排序樹

二叉搜索樹,二叉查找樹,二叉排序樹這三個是同一個東西,它建立在二叉樹基礎上,符合二叉樹特點,也有自身特點:·對於非空的左子樹(也是二叉查找樹)而言,其所有節點的值均小於根節點的值。對於非空的右子樹(也是二叉查找樹)而言,其所有節點的值均大於根節點的值。

二叉搜索樹

  • 這種存儲方式既便於查找又能保持相對順序,三個名字也是這樣來的
  • 對於一個分佈均勻的二叉搜索樹,其時間複雜度爲O(logn),n爲節點數
  • 也存在分佈不均勻的二叉搜索樹,比如左子樹10個節點,右子樹一個節點,嚴重失衡
  • 嚴重失衡的二叉搜索樹效率會大打折扣,從O(logn)退化 到O(n)也是很可能的
  • 所以也有一些常用的平衡手段(紅黑樹/AVL等)

二叉樹的遍歷

基於線性結構的遍歷自然簡單,但對於非線性結構的遍歷,需要轉換成線性的方式,曲線救國。常見的遍歷方式有兩大類共四種,深度優先遍歷(前序/中序/後序),廣度優先遍歷:層序

在這裏插入圖片描述

前序遍歷:根,左,右

  • 7,5,2,6,9,11

中序遍歷:左,根,右

  • 2,5,6,7,9,11

後序遍歷:左,右,根

  • 2,6,5,11,9,7

層序遍歷

  • 7,5,9,2,6,11
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章