1. 程式人生 > 其它 >1.資料結構

1.資料結構

陣列

特點

  1. 查詢快,因為記憶體地址是連續的,通過索引可以找到某個元素
  2. 增加、刪除慢,因為長度是固定的,如果增加一個元素,就需要建立一個與新加元素的長度相同的陣列,把原陣列的內容新增進來。刪的話與之相同

連結串列

單向連結串列

雙向連結串列

特點

  1. 記憶體地址不連續
  2. 不支援下標搜尋,支援順序的遍歷搜尋
  3. 增加、刪除操作找到對應節點改變連結串列的頭尾指向即可,無需移動元素的節點位置

Demo

LinkedList

private static class Node<E> {
  E item; //節點的元素
  Node<E> next; //下一個節點
  Node<E> prev; //上一個節點

  Node(Node<E> prev, E element, Node<E> next) {
    this.item = element;
    this.next = next;
    this.prev = prev;
	}
}

二叉樹

  1. 某節點的左子樹的值必須小於該節點的值
  2. 某節點的右子樹的值必須大於該節點的值

不平衡二叉樹

特點

查詢效率太低,如果我現在要查1,必須要查6次才能查到。下面的紅黑樹就是為了優化二叉樹平衡的一種解決方案

紅黑樹

紅黑樹是一個自平衡(不是絕對的平衡)的二叉查詢樹

特點

  1. 每個節點要麼是黑色,要麼是紅色
  2. 根節點都是黑色
  3. 每個葉子節點都是黑色
  4. 每個紅色節點的兩個位元組點一定是黑色
  5. 任意一節點到每個葉子節點的路徑中都包含相同的黑色節點

紅黑樹練習網站: http://algoanim.ide.sk/index.php?page=showanim&id=63

紅黑樹能自平衡,它靠的是什麼?三種操作:左旋、右旋和變色

原理

  1. 左旋:以某個結點作為支點(旋轉結點),其右子結點變為旋轉結點的父結點,右子結點的左子結點變為旋轉結點的右子結點,左子結點保持不變。
  2. 右旋:以某個結點作為支點(旋轉結點),其左子結點變為旋轉結點的父結點,左子結點的右子結點變為旋轉結點的左子結點,右子結點保持不變。
  3. 變色:結點的顏色由紅變黑或由黑變紅。