C++數據結構_樹的理論學習筆記(1)_基本概念和基本操作

        前言:樹型結構是一類重要的非線性結構,其特點是結點之間有分支,並具有層次關係。

1.1 基本概念

1.1.1 樹

        樹是由n(n≥1)個有限結點組成的一個具有層次關係的集合, 把它叫作“樹”是因爲它看起來像一棵倒掛的樹,也就是說樹是根朝上,而葉朝下的。如圖所示:
在這裏插入圖片描述
        它具有以下的特點:
            ① 每個結點有零個或多個子結點;
            ② 每個子結點只有一個父結點;
            ③ 沒有前驅的結點爲根結點;
            ④ 除了根結點外,每個子結點可以分爲許多個不相交的子樹。

        爲方便描述樹的特點,先列出將會涉及到的樹的基本概念
            ①結點的度:一個結點含有的子樹個數;
            ②樹的度:一棵樹中,最大的結點的度;
            ③葉結點(終端結點):度爲0的結點;
            ④分支結點(非終端結點):度不爲0的結點;
            ⑤孩子結點:一個結點的子樹的根結點;
            ⑥雙親結點(父結點):在含有孩子的結點中,該結點稱爲孩子結點的雙親結點;
            ⑦兄弟結點:具有相同雙親的結點;
            ⑧祖先節點:從根到該結點所經分支上的所有結點;
            ⑨子孫結點:以某結點爲根的子樹中任意結點;
            ⑩節點的層次:從根開始定義,根爲第一層,根的孩子爲第二層,以此類推。如下圖所示:
                在這裏插入圖片描述
            ⑪樹的高度(深度):樹中結點的最大層次;
            ⑫路徑:從根結點到某一結點的一條通道;
            ⑬路徑長度:路徑經過的邊的個數。如下圖所示:
                在這裏插入圖片描述

1.1.2 二叉樹

        1.綜述:二叉樹是每個結點最多有兩個子樹的有序樹,通常子樹的根被稱爲“左子樹”和“右子樹”。如下圖所示。二叉樹是一種最簡單的樹結構,任何樹都可以簡單轉換爲二叉樹。
            在這裏插入圖片描述
        2.樹和二叉樹的區別
            ①樹的結點個數至少爲1,而二叉樹的結點個數可以爲0;
            ②樹中結點的最大度數沒有限制,而二叉樹結點最大度數爲2

        3.兩種特殊的而二叉樹
            (1)滿二叉樹
                滿二叉樹中所有的葉節點都在最後一層,而其他分支結點的度數都爲2。示例如下:
                    在這裏插入圖片描述
            (2)完全二叉樹
                若一個二叉樹扣除其最後一層後變成一個滿二叉樹,且最後一層的所有結點都向左靠齊,則稱該二叉樹爲完全二叉樹。示例如下:
                    在這裏插入圖片描述
            ★滿二叉樹一定爲完全二叉樹,完全二叉樹不一定爲滿二叉樹

        3.二叉樹常見的性質
            性質1    一顆非空二叉樹的第i層上最多有2i-1個結點(i≥1)
            性質2    深度爲h的二叉樹最多有2h-1個結點(h>1)
            性質3    對於任何一棵二叉樹T,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0=n2+1
            性質4    若一個正則二叉樹(只有度爲0和2結點的二叉樹)中有n個葉子結點,則該二叉樹結點總數爲log2n(由 性質2 推導)
            性質5    對於具有n個結點的完全二叉樹,如果如果按照從上到下、同一層次上的結點按從左 到右的順序對二叉樹中的所有結點從1開始順序編號,則對於序號爲i的結點,有
                ① 如果i>1,則序號爲i的結點其雙親結點的序號爲[i/2] ([i/2] 表示對i/2的值取整); 如果i=1,則結點i爲根結點,沒有雙親
                ② 如果2i>n,則結點i無左孩子(此時結點i爲終端結點);否則其左孩子爲結點2i
                ③ 如果2i+1>n,則結點i無右孩子;否則其右孩子爲結點2i+1

1.1.3 森林

        由m(m≥0)棵互不相交的樹構成的集合稱爲森林。如下圖所示,該森林由三棵樹所構成:
            在這裏插入圖片描述

1.2 基本操作

1.2.1 樹的遍歷

        1.前序遍歷
            ①訪問根結點;
            ②按照從左到右的順序前序遍歷根結點的每一棵子樹。
        2.後序遍歷
            ①按照從左到右的順序後序遍歷根結點的每一棵子樹;
            ②訪問根結點。
        3.層序遍歷(廣度遍歷)
            從樹的第一層(也就是根結點)開始自上而下逐層遍歷,每一層按照從左到右的順序逐個訪問結點。

    下圖展示了按照這三種遍歷方式所對應的遍歷結果:
        在這裏插入圖片描述

1.2.2 二叉樹的遍歷

        1.前序遍歷
            ①訪問根結點
            ②前序遍歷訪問根結點的左子樹
            ③前序遍歷訪問根結點的右子樹
        2.中序遍歷
            ①中序遍歷訪問根結點的左子樹
            ②訪問根結點
            ③中序遍歷訪問根結點的右子樹
        3.後序遍歷
            ①後序遍歷訪問根結點的左子樹
            ②後序遍歷訪問根結點的右子樹
            ③訪問根結點
        4.層序遍歷
            按照從上到下,同一層次從左到右的順序訪問二叉樹

        下圖展示了一棵二叉樹四種遍歷方式的結果:
            在這裏插入圖片描述
    ★由二叉樹的前序(後序)序列和中序序列可以唯一確定一棵二叉樹,但是只由前序序列和後序序列不能確定一棵二叉樹

1.2.3 森林的遍歷

        1.前序遍歷
            若森林非空,則:
            ①訪問森林中第一棵樹的根結點
            ②前序遍歷第一棵樹中根結點的每一棵子樹
            ③前序遍歷除第一棵樹外的其他樹
        2.後序遍歷
            若森林非空,則:
            ①後序遍歷第一棵樹的根結點的各個子樹
            ②訪問第一棵樹的根結點
            ③後序遍歷除第一棵樹外的其他樹

        下圖給出了一個三棵樹的森林的兩種遍歷結果:
            在這裏插入圖片描述
        ★根據森林,樹和二叉樹的關係,可以得知:
            ①前序遍歷森林前序遍歷該森林對應的二叉樹
            ②後序遍歷森林中序遍歷該森林所對應的二叉樹
            ③前序遍歷樹前序遍歷該樹所對應的二叉樹
            ④後序遍歷樹中序遍歷該樹所對應的二叉樹

1.2.4 樹、森林和二叉樹的轉換

        1.樹、森林轉換成二叉樹
            ①在所有兄弟之間加一條線
            ②對每個結點,去掉該結點和除長子外與其他孩子的連線
        樹轉換爲二叉樹如下圖所示:
            在這裏插入圖片描述
        森林轉換成二叉樹如下圖所示:
            在這裏插入圖片描述
        2.二叉樹轉換成樹、森林
        若結點x是雙親y的左孩子,則把x的右孩子、右孩子的右孩子都與y連起來,最後去掉雙親到右孩子的連線。如圖所示:
            在這裏插入圖片描述

後置:C++數據結構_樹的理論學習筆記(2)_存儲結構,二叉樹的實現

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