日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树与二叉树(二叉树前传、数据结构初阶、C语言)

發布時間:2024/1/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树与二叉树(二叉树前传、数据结构初阶、C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、樹的概念及結構
    • (一)、樹的概念
    • (二)、樹的相關概念
    • (三)、樹的表示
  • 二、二叉樹的概念及結構
    • (一)、二叉樹的概念
    • (二)、滿二叉樹和完全二叉樹
    • (三)、二叉樹的性質
    • (四)、二叉樹的儲存結構


前言

  • 在學習二叉樹的實現之前,我們先學習和了解一些關于樹與二叉樹的重要知識,本篇博客整理了樹與二叉樹的概念和結構,至于對于學習二叉樹來說,我總結的這些知識點足夠了。如果想更加深入了解樹的相關知識,這里推薦一本書:《離散數學》(第二版,屈婉玲 耿素云 張立昂)
  • 繪圖部分:drawio、畫圖板
  • 代碼:C語言
  • 重點:二叉樹

一、樹的概念及結構

(一)、樹的概念

樹是一種非線性的數據結構,它由n(n >= 0)個有限結點組成的一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

  • 有一個特殊的結點,稱為根結點,根節點沒有前驅結點
  • 除根節點外,其余結點被分成M(M>0)個互不相交的集合T1、T2、……、Tm,其中每一個集合Ti(1 <= i <= m)又是一棵結構與樹類似的子樹
  • 每棵子樹的根結點有且只有一個前驅,可以有0個或多個后繼。因此,樹是遞歸定義的。

  • 注意:樹形結構中,子樹之間不能有交集(不能有環的結構),否則就不是樹形結構,如以下情況:

  • 也就是說,子樹是不相交的
  • 除了根結點外,每個結點有且僅有一個父節點
  • 一顆N個結點的樹,有N-1條邊
    • 樹在實際中的應用,比如文件系統的目錄樹結構

    (二)、樹的相關概念

    • 節點的度一個節點含有的子樹的個數稱為該節點的度; 如上圖:A的為6
    • 葉節點或終端節點度為0的節點稱為葉節點; 如上圖:B、C、H、I…等節點為葉節點
    • 分支節點或非終端節點:度不為0的節點; 如上圖:D、E、F、G…等節點為分支節點
    • 父節點或雙親節點若一個節點含有子節點,則這個節點稱為其子節點的父節點; 如上圖:A是B的父節點
    • 孩子節點或子節點一個節點含有的子樹的根節點稱為該節點的子節點; 如上圖:B是A的孩子節點
    • 兄弟節點:具有相同父節點的節點互稱為兄弟節點; 如上圖:B、C是兄弟節點
    • 樹的度:一棵樹中,最大的節點的度稱為樹的度; 如上圖:樹的度為6
    • 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
    • 樹的高度或深度樹中節點的最大層次; 如上圖:樹的高度為4
    • 堂兄弟節點:雙親在同一層的節點互為堂兄弟;如上圖:H、I互為兄弟節點
    • 節點的祖先從根到該節點所經分支上的所有節點;如上圖:A是所有節點的祖先
    • 子孫以某節點為根的子樹中任一節點都稱為該節點的子孫。如上圖:所有節點都是A的子孫
    • 森林:由m(m>0)棵互不相交的樹的集合稱為森林.并查集就是一顆森林

    (三)、樹的表示

    • 樹結構相對線性表就比較復雜了,要存儲表示起來就比較麻煩了,既然保存值域,也要保存結點和結點之間的關系,實際中樹有很多種表示方式如:雙親表示法,孩子表示法、孩子雙親表示法以及孩子兄弟表示法
      等。
    • 我們這里就簡單的了解其中最常用的孩子兄弟表示法(左孩子右兄弟)。,如下:
    typedef int DataType; struct Node { struct Node* _firstChild1; // 第一個孩子結點 struct Node* _pNextBrother; // 指向其下一個兄弟結點 DataType _data; // 結點中的數據域 };
    • 以下是一個實例,用以上結構可以完美的表示一顆樹,且該樹是唯一的


    二、二叉樹的概念及結構

    (一)、二叉樹的概念

    • 一棵二叉樹是結點的一個有限集合,該集合:
  • 或者為空
  • 由一個根節點加上兩棵別稱為左子樹和右子樹的二叉樹組成
    • 從上圖可以看出:
  • 二叉樹不存在度大于2的結點
  • 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹
    • 注意:對于任意的二叉樹都是由以下幾種情況復合而成的:

    • 現實中的二叉樹:


    (二)、滿二叉樹和完全二叉樹

    • 滿二叉樹:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K(規定根結點層數為1),且結點總數是2^k-1 ,則它就是滿二叉樹。
    • 完全二叉樹完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹
    • 對于上面完全二叉樹的定義可能不是很好理解,這里給出另一種理解方式對于層數為K(規定根結點層數為1)的二叉樹,若其K-1層為滿二叉樹,且第k層的結點,從左往右依次“連續”,符合左右左右……,不出現左左和右右的連續情況的二叉樹即為完全二叉樹,下面舉例說明:


    (三)、二叉樹的性質

  • 若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2^(i-1)個結點

  • 若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是2^h-1,即滿二叉樹的情況

  • 若規定根節點的層數為1,則深度為h的二叉樹的最小結點樹為2^(h-1),即h-1層滿二叉樹再加一個左結點的情況

  • 對任何一棵二叉樹, 如果度為0其葉結點個數為n0 , 度為2的分支結點個數為n2 ,則有n0 = n2 +1

  • 若規定根節點的層數為1,具有n個結點的滿二叉樹的深度,h = log(n+1) . (ps: h是log以2為低,n+1的對數)


  • 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從0開始編號,則對于序號為i的結點有:
    • 若i>0,i位置節點的雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親節點
    • 若2i+1<n,左孩子序號:2i+1,2i+1>=n否則無左孩子
    • 若2i+2<n,右孩子序號:2i+2,2i+2>=n否則無右孩子

    (四)、二叉樹的儲存結構

    二叉樹一般可以使用兩種結構存儲,一種順序結構,一種鏈式結構。

  • 順序存儲
    順序結構存儲就是使用數組來存儲,一般使用數組只適合表示完全二叉樹因為不是完全二叉樹會有空間的浪費。而現實中使用中只有堆才會使用數組來存儲,關于堆會在后面的博客中詳細說明。二叉樹順序存儲在物理上是一個數組,在邏輯上是一顆二叉樹
  • 鏈式存儲
    二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。 通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址。鏈式結構又分為二叉鏈和三叉鏈,當前我們學習中一般都是二叉鏈,后面課程學到高階數據結構如紅黑樹等會用到三叉鏈。
    • 鏈式儲存的定義代碼如下:
    typedef int BTDataType; // 二叉鏈 struct BinaryTreeNode {struct BinTreeNode* _pLeft; // 指向當前節點左孩子struct BinTreeNode* _pRight; // 指向當前節點右孩子BTDataType _data; // 當前節點值域 } // 三叉鏈 struct BinaryTreeNode {struct BinTreeNode* _pParent; // 指向當前節點的雙親struct BinTreeNode* _pLeft; // 指向當前節點左孩子struct BinTreeNode* _pRight; // 指向當前節點右孩子BTDataType _data; // 當前節點值域 }

    學習記錄:

    • 本篇博客整理于2022.7.5
    • 請多多指教😏

    總結

    以上是生活随笔為你收集整理的树与二叉树(二叉树前传、数据结构初阶、C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。