1. 程式人生 > >【資料結構】陣列、連結串列、棧、佇列、二叉樹

【資料結構】陣列、連結串列、棧、佇列、二叉樹

陣列

  1. 陣列儲存的資料在地址空間上是連續的。
  2. 方便資料的查詢,查詢資料的時間複雜度為O(1)。

如圖所示

連結串列

  1. 連結串列儲存的資料在地址空間上可連續,可不連續。
  2. 連結串列中的每一個節點都包括資料和指向下一個地址的指標。
  3. 查詢資料的時間複雜度為O(n),方便資料的增刪。

如圖所示

如何快速找到連結串列的中間值:

  1. 先遍歷一遍單鏈表確定長度L,然後再次從頭結點出發迴圈L/2次
  2. 設定兩個指標都指向單鏈表的頭結點,第一個指標的移動速度是第二個的2倍,當第一個指向末尾結點時,第二個就指向了中間結點。這種方法要快一些。

  1. 棧是一種先入後出的邏輯結構,每次加入新的元素和拿走元素都在頂部操作。

如圖所示

佇列

  1. 佇列是一種先入先出的邏輯結構,對元素的操作分別在對頭和隊尾,元素的插入在對尾,元素的刪除在對頭。

如圖所示

二叉樹

  1. 每個節點至多隻有兩個子樹的結構,在父節點中有指向左右子樹的指標
    • 先序遍歷:根–左–右
    • 中序遍歷:左–根–右
    • 後序遍歷:左–右–根
  2. 查詢二叉樹:左子樹的值小於根節點的值,右子樹的值大於根節點的值,在插入資料時,從根節點開始往下比較,小於比較值則放在左邊,大於比較值放在右邊。插入一個值的時間複雜度是O(logn)
  3. 平衡二叉樹:左右子樹的高度差的絕對值不超過1
    如圖所示

相關推薦

資料結構高效雙向連結串列listtree(

vi正常模式下: "shift + g" 跳到最後一行 "gg" 跳到第一行 <效率更高的雙向連結串列結構程式碼>/*程式碼*/ 01link.c #include <stdlib.h> #include "01link.h" //連結串列初始化 v

資料結構單向迴圈連結串列

寫的中間發現一個問題,我試了一下,final修飾的引用是指該引用只能指向一個物件不能更改指向其他物件,但是該引用調該物件的方法進行內部資訊修改是OK的 package 連結串列.迴圈連結串列; import java.util.NoSuchElement

資料結構c++ 實現連結串列的建立,查詢,列印,刪除,插入

//程式很簡單,但是要捋順邏輯關係,留著備用 #include #include"stdafx.h" using namespace std; struct node { int data; node* next; }; node * created_hea

資料結構陣列連結串列佇列

陣列 陣列儲存的資料在地址空間上是連續的。 方便資料的查詢,查詢資料的時間複雜度為O(1)。 連結串列 連結串列儲存的資料在地址空間上可連續,可不連續。 連結串列中的每一個節點都

資料結構之——陣列連結串列

1. 陣列 1.1 陣列為什麼從零編號? 陣列名代表陣列的首地址,陣列的下標其實代表陣列中某個元素相對首地址的偏移量,陣列的第一個元素是零偏移,因此從 0 開始。 上面其實也只是一個解釋, C 語言設計者用零開始編號,後來的各種語言也便紛紛效仿,因此就形成了這個習慣。 1

資料結構陣列連結串列的區別以及各自的優缺點

原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點。 大致總結一下特點和區別,拿幾個人一起去看電影時坐座位為例。 陣列的特點

資料結構Java實現各類經典排序演算法——插入排序希爾排序

一、插入排序    顧名思義,插入排序從左往右掃描陣列,每趟排序把一個元素“插入”到已排序部分陣列的合適位置中。既然是“插入”,則不必兩兩交換元素來進行排序,從邏輯上把當前元素放到合適位置,並把該位置右側部分元素往右移動一格就可以了。這樣做和氣泡排序的交換相鄰元素比,好處在於

資料結構陣列中的最大連續遞增子序列

陣列中的數是亂序的,求出陣列中最大的連續子序列(這裡為遞增)。 方法一:用一個輔助陣列list[length],記錄下陣列中每個元素對應的最大連續序列長度,預設為1,即從該元素後沒有連續的序列。當i元

資料結構陣列連結串列的區別(陣列連結串列的優缺點 & 陣列連結串列的適用場景)

陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點 陣列 一、陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間

資料結構示例之用連結串列實現

以下是“使用連結串列實現棧”的簡單示例: 1. 用c語言實現的版本 #include<stdio.h> #include<stdlib.h> struct s_node { int data; struct s_node *next; };

演算法與資料結構(3):基本資料結構——連結串列佇列,有根

原本今天是想要介紹堆排序的。雖然堆排序需要用到樹,但基本上也就只需要用一用樹的概念,而且還只需要完全二叉樹,實際的實現也是用陣列的,所以原本想先把主要的排序演算法講完,只簡單的說一下樹的概念。但在寫的過程中才發現,雖然是隻用了一下樹的概念,但要是樹的概念沒講明白的話,其實不太好理解。所以決定先介紹一下基本的資

陣列連結串列佇列之間的關係及堆和之間的關係

本屌最近在學習資料結構過程中,由於連續看了陣列,棧,佇列,連結串列等,一時混雜,下面摘取參考資料,供自己學習使用。 第一部分:介紹了資料儲存結構和資料結構的區別,以及連結串列和陣列的差異。 第二部分:介紹了堆和棧的區別。 (1)資料儲存結構:計算機的一個概念,描述資料在計算機中儲存方式;常用

#資料結構與演算法學習筆記#劍指Offer35:是否平衡/AVL + 測試用例(JavaC/C++)

2018.11.3 前幾天有用遞迴實現了二叉樹的深度#資料結構與演算法學習筆記#劍指Offer36:二叉樹的深度(Java),因此可以對每個結點先序遍歷進行一次平衡驗證,只要確定每個結點都是平衡的

劍指offer系列——刪除連結串列中重複的結點,的下一個結點,對稱的

刪除連結串列中重複的結點 題目描述 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 解題思路:

資料結構——由中序與後序遍歷確定的

由中序與後序遍歷確定的二叉樹 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct Node{ //二叉樹

資料結構——由前序與中序遍歷確定的

由前序與中序遍歷確定的二叉樹 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct Node{ //二叉樹

連結串列的方式建立一棵,並以非遞迴演算法中序輸出;計算的繁茂度,並判斷是否為完全

以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度

資料結構基礎 層次遍歷和中序遍歷還原

【問題描述】 給出一個層次遍歷,和一箇中序遍歷的結果字串 層次  A B C D E F G 中序  D B A F E G C 其對應的二叉樹是:        A      /  /      B  C      /  /      D  E        / /  

資料結構線性表的鏈式儲存連結串列的初始化插入元素刪除元素操作(三)

雙向連結串列的初始化插入與刪除 程式碼收穫 雙向連結串列刪除結點需要注意要刪除最後一個結點和不是最後一個結點分類討論。 插入和刪除時注意修改上一個結點裡指向下一個結點的指標與下一個結點裡指向上一個結點的指標。 #include <stdio.h>

資料結構順序表單鏈表迴圈連結串列的插入與刪除

寫在前面的 順序表 插入 刪除 定位 單鏈表 插入 刪除 總結 寫在前面的        在複習資料結構的過程中對於連結串列的操作總是容易忘記,時不時的就不知道具體的該怎麼