1. 程式人生 > >陳越《資料結構》第三講 樹(上)

陳越《資料結構》第三講 樹(上)

3.1 樹與樹的表示

3.1.1 引子:查詢

分層次組織在管理上具有更高的效率!


1. 定義
根據某個給定 關鍵字K ,從 集合R 中找出關鍵字與K 相同的記錄。

2.分類:
- 靜態查詢:集合中 記錄是固定 的;
- 動態查詢: 集合中 記錄是動態變化的。

3.靜態查詢的方法

  • 方法1: 順序查詢(時間複雜度為O(n));
    //在陣列的頭部,建立,可減少判斷的分支。
    這裡寫圖片描述

  • 方法2:二分查詢(時間複雜度O(logN))。

    這裡寫圖片描述

問:

在二分查詢中,我們是取mid等於left和right的中間值,即用等分的方法進行查詢。
那為什麼一定要等分吶?能不能進行“黃金分割”?也就是mid=left+0.618(right-left),當然mid要取整數。如果這樣查詢,時間複雜性是多少?也許你還可以程式設計做個試驗,比較一下二分法和“黃金分割”法的執行效率。

答:
二分法每次能有100%的概率能只剩50%的資料,每次剩下的期望為50%,即每次除以2。所以時間複雜度是:log2(N)
而黃金分割的話每次都有0.618的概率剩0.6180.382的概率剩0.382,每次剩下的期望為0.528,即1/0.528

=1.894。所以時間複雜度是:log1.894(N)=1.085log2(N)

3.1.2 樹

  1. 定義:nn0個結點構成的有限集合
    • n=0 時,稱為 空樹
    • 樹中有一個稱為“ (Root ) ”的特殊結點, 用 r 表示;
    • 其餘結點可分為m(m>0) 個 互不相交的 有限集,其中每個集合本身又是一棵樹,稱為原來樹的“ 子樹 (SubTree )”。

2.

  • 子樹是 不相交 的 ;
  • 除了根結點外, 每個結點有且僅有一個父結點
  • 一棵N 個結點的樹有N-1 條邊

3.
樹是保證節點聯通的最小的一種聯通方式!

  1. 結點的度(Degree ): 結點的 子樹個數
  2. :樹的所有結點中最大的度數;
  3. 葉結點 (Leaf): 度為0 的結點;
  4. 父結點 (Parent ):有子樹的結點是其子樹的根結點的父結點;
  5. 子結點 (Child ):若A 結點是B 結點的父結點,則稱B 結點是A 結點的子結點;子結點也稱 孩子結點
  6. 兄弟結點 (Sibling ):具有同一父結點的各結點彼此是兄弟結點;
  7. :從結點n1nk路徑 為一個結點序列n1,n2,,nk,nini+1 的父結點。路徑所包含邊的個數為 路徑的長度 ;
  8. 祖先結點(Ancestor) :沿 樹根到某一結點路徑 上的所有結點都是這個結點的祖先結點;
  9. 子孫結點(Descendant) :某一結點的 子樹中的所有結點 是這個結點的子孫;
  10. (Level):規定 根結點在1 層 ,其它任一結點的層數是其父結點的層數加1;
  11. (Depth) :樹中所有結點中的 最大層次 是這棵樹的深 度。

4.

兒子-兄弟表示法
所需的總空間為3N(N為節點數)。
這裡寫圖片描述

問:
樹的集合稱為森林。是否也可以使用“兒子-兄弟”表示法儲存森林?如何實現?
答:
可以,不同樹的根節點看成是這棵樹的入口,各個樹之間可以看做是兄弟節點。

3.2 二叉樹及儲存結構

3.2.1 二叉樹

  1. 定義:一個有窮的結點集合。

    • 這個集合 可以為空
    • 若不為空,則它是由 根結點 和稱為其 左子樹TL右子樹TR 的兩個不相交的二叉樹組成。
  2. 這裡寫圖片描述

    • 一個二叉樹第 i層的最大結點數為:2i1i1
    • k的二叉樹有最大結點總數為: 2k

      相關推薦

      資料結構三講

      3.1 樹與樹的表示 3.1.1 引子:查詢 分層次組織在管理上具有更高的效率! 查找 1. 定義: 根據某個給定 關鍵字K ,從 集合R 中找出關鍵字與K 相同的記錄。 2.分類: - 靜態查詢

      資料結構——二叉程式碼

       二叉樹 C++ 環境codeblocks17 通過 /* 二叉樹 使用了自定義的 棧 和 佇列 @CGQ 2018/10/29 */ #include <iostream> #include <stdio.h> #include <stdlib.h&

      資料結構基礎之查詢表查詢

      轉自:http://www.cnblogs.com/edisonchou/p/4700850.html   查詢(上):基本查詢與樹表查詢 只要你開啟電腦,就會涉及到查詢技術。如炒股軟體中查股票資訊、硬碟檔案中找照片、在光碟中搜DVD,甚至玩遊戲時在記憶體中查詢攻擊力、魅力值等

      資料結構--二叉C++

      零、二叉樹解決的問題 通過學習陣列和連結串列,前者可以在常數時間內找到目標物件,但是插入和刪除操作,都需要耗費線性的時間。後者則可以在常數時間內進行插入和刪除,但是查詢某一元素,則需要線性時間。很顯然各有利弊,所以我們能不能選用一種更好的結構呢?樹結構則是很好

      資料結構-二叉1以及前序、中序、後序遍歷python實現

      上篇文章我們介紹了樹的概念,今天我們來介紹一種特殊的樹——二叉樹,二叉樹的應用很廣,有很多特性。今天我們一一來為大家介紹。 二叉樹 顧名思義,二叉樹就是隻有兩個節點的樹,兩個節點分別為左節點和右節點,特別強調,即使只有一個子節點也要區分它是左節點還是右節點。 常見的二叉樹有一般二叉樹、完全二叉樹、滿二叉樹、線

      資料結構基礎之圖:圖的基本概念

      轉自:http://www.cnblogs.com/edisonchou/p/4672188.html   圖(上):圖的基本概念 前面幾篇已經介紹了線性表和樹兩類資料結構,線性表中的元素是“一對一”的關係,樹中的元素是“一對多”的關係,本章所述的圖結構中的元素則是“多對多”的

      MOOC資料結構第二週02-線性結構1 兩個有序連結串列序列的合併 15 分

      首先讀題,題目中說L1,L2都為含頭節點的,第一次做的時候沒有認真讀題以為不帶頭節點,傳出的連結串列也要求帶頭節點。 程式碼 List Merge(List L1,List L2){ List pa,pb,pc,L; L = (List)malloc(si

      資料結構---二分搜尋java實現

      樹 樹的分類 1、 二分搜尋樹 2、 平衡二叉樹: AVL;紅黑樹 3、 堆; 並查集 4、線段樹;Trie(字典樹、字首樹) 二叉樹 二叉樹具有天然的遞迴結構 每個節點的左子樹也是二叉樹 每個節點的右子樹也是二叉樹 二叉樹不一定是“滿”的 一

      資料結構的Java實現—— 二叉

      目錄 樹 二叉樹 樹 樹(tree)是一種抽象資料型別(ADT),用來模擬具有樹狀結構性質的資料集合。它是由n(n>=0)個有限節點組成一個具有層次關係的集合。節點一般代表一些實體,在java中節點一般代表物件。連線節點的線稱為邊,一般從一個節點到另一個節點的唯

      資料結構(Java筆記)—二叉

      樹(Tree)結構是一種描述非線性層次關係的的資料結構,樹中有一個根結點,根節點下分佈著一些互不交叉的子集合(子樹) 在一個樹結構中,有且只有一個根結點,根結點沒有直接前驅; 每個結點有且只有一個直接前驅; 每個結點可以有多個直接後繼; 二叉樹: 在樹結構中,二叉樹是

      Java資料結構之 AVL平衡二叉簡析

      AVL(即平衡二叉樹)樹是帶有平衡條件的二叉查詢樹(二叉查詢樹即左孩子小於根節點,右孩子大於根節點的二叉樹)。一顆AVL樹是其每個節點的左子樹和右子樹的高度最多差 1 的二叉查詢樹(空樹的高度定為-1),只有一個節點的樹高度為0。在高度為h的AVL樹中,最少節點數S(h)=S

      基礎資料結構與演算法實現2—二叉搜尋BST

      import java.util.LinkedList; import java.util.Queue; public class BST <E extends Comparable<E>> { private c

      淺談資料結構中的B/B+/B-/B*

      一、B樹(二叉搜尋樹) 1、所有非葉子節點至多擁有兩個兒子。 2、所有節點儲存一個關鍵字。 3、左孩子小於父節點,右孩子大於父節點。 二、B-樹(多路搜尋樹)1、定義任意多個非葉子節點最多隻有M個孩子 2、根節點的兒子數【2,M】 3、除根節點之外的非葉子節點的孩子數

      資料結構—二叉C語言實現

      以下所有內容來自網易雲課堂——資料結構(小甲魚版) 對於樹來說,一旦可以指明他的分支數,那麼就可以用連結串列來實現了 二叉樹是應用廣泛的樹,因為現實世界大部分模型都只包含0,1這兩種情況,非常適合用二叉樹 如下: typedef struct BiNode {

      資料結構系列——字尾附Java實現程式碼

      字尾樹,說的通俗點就是將一個字串所有的字尾按照字首樹(Trie樹,可參考此篇文章)的形式組織成一棵樹。 什麼是字尾樹 舉例:“banana\0”,其中 “\0” 作為文字結束符號,該字串所有的字尾如下: banana\0 anana\0 na

      資料結構和演算法之美-二叉

      學習筆記 “樹”這種資料結構的形態特徵 包括有哪些命名節點和它們的概念,這些節點是根節點,葉子節點,父節點,子節點,兄弟節點等;以及相關節點關係的建立,這些關係是父子關係和兄弟關係 “樹"這種資

      資料結構與演算法複習3—— 線段

      http://www.cppblog.com/MemoryGarden/archive/2009/04/11/79565.aspx http://www.notonlysuccess.com/?p=59 http://edu.codepub.com/2009/1125/18163.php POJ 2104,

      資料結構與演算法複習22—— 狀陣列

      需要熟練掌握,下面是不錯的文章: 樹狀陣列上的二分法 http://cylixstar.blogbus.com/logs/54695632.html 我的標籤: 樹狀陣列 http://www.cnblogs.com/zgmf_x20a/tag/%e6%a0%91%e7%8a%b6%e6%95%b0%e7%

      資料結構-二叉葉子節點到根節點的路徑相關問題

      二叉樹的括號表示法:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))實現的功能:        1.輸出所有的葉子節點        2.輸出所有葉子節點到根節點的路徑        3.輸出2中第一條最長的路徑複習資料結構中......,程式碼適合

      資料結構基礎溫故-4.與二叉

      前面所討論的線性表元素之間都是一對一的關係,今天我們所看到的結構各元素之間卻是一對多的關係。樹在計算機中有著廣泛的應用,甚至在計算機的日常使用中,也可以看到樹形結構的身影,如下圖所示的Windows資源管理器和應用程式的選單都屬於樹形結構。樹形結構是一種典型的非線性結構,除了用於表示相鄰關係外,還可以表示層次