數據結構中我們常用的就是樹,表,圖。我們上幾節學的都屬於線性表是一對一的線性結構,然後這節我們要開始學習非線性結構樹。
在樹的學習中我們主要學習二叉樹,但是關於樹的一些基本概念我們還是都要知道的。
二叉樹中我們主要學習幾種常用的遍歷方式,前 中 後序遍歷及層次遍歷。
一.樹的基本概念
先來點官方套話
樹(Tree)是n(n≥0)個節點的有限集合T,它滿足兩個條件 :
有且僅有一個特定的稱爲根(Root)的節點;
其餘的節點可以分爲m(m≥0)個互不相交的有限集合T1、T2、……、Tm,其中每一個集合又是一棵樹,並稱爲其根的子樹
表示方法 :樹形表示法、目錄表示法。
說了一大堆,感覺還是沒看懂。那就把上面的話忽略直接看圖:
結點的度數:一個結點子樹的個數
終端結點,葉子結點:度數爲零的結點
分支結點:度數不爲零的節點
內部結點:除根結點外的分支節點
同樣還是看圖吧,更直接:
數的高度或深度:樹中節點層數最大值。
結點的關係
有序樹:樹中每個節點的各個子樹的排列爲左到右2,不能交換,及兄弟間是有序的。
森鈴:m棵互不相交的樹的集合稱爲森林。
根結點沒有前驅節點,葉結點沒有後繼結點
二.二叉樹
1.二叉樹基本概念
二叉樹:由一個根節點以及兩棵互不相交的分別稱爲左子樹和右子樹組成。
二叉樹嚴格區分左右。
滿二叉樹:
在一棵二叉樹中,如果所有的分支結點都存在左子樹和右子樹,並且所有的葉子都在同一層上,腳滿二叉樹。
完全二叉樹
滿二叉樹一定是完全二叉樹,但是完全二叉樹不一定是滿二叉樹。
完全二叉樹不太好理解,但是經常出選擇題,我們按照下面規律來選就可以。
按照滿二叉樹的結構按層次編號,編號不能出現空檔,纔是完全二叉樹。
上面的這些都不是完全二叉樹,
2.二叉樹性質
- 二叉樹第i(i≥1)層上的節點最多爲2i-1個
- 深度爲k(k≥1)的二叉樹最多有2k-1個節點。
- 滿二叉樹 :深度爲k(k≥1)時有2k-1個節點的二叉樹。
- 完全二叉樹 :只有最下面兩層有度數小於2的節點,且最下面一層的葉節點集中在最左邊的若干位置上。具有n個節點的完全二叉樹的深度爲 (log2n)+1或log2(n+1)
3.二叉樹存儲結構
二叉樹的順序存儲:按照完全二叉樹的編號方法從上到下,從左到右,根節點爲1號節點進行編號。
當遇到不完全二叉樹,需要通過虛節點進行補充,也就導致順序存儲很浪費存儲空間。
順序存儲結構一般只用在完全二叉樹上。
所以作爲理解就好,主要還是用鏈式存儲結構
鏈式結構的定義也是比較好理解
typedef int data_t ;
typedef struct node_t;
{
data_t data ;
struct node_t *lchild ,*rchild ;
} bitree_t ;
三.二叉樹的遍歷
遍歷 :沿某條搜索路徑周遊二叉樹,對樹中的每一個節點訪問一次且僅訪問一次。
先序遍歷:先訪問樹根,再訪問左子樹,最後訪問右子樹
中序遍歷:先訪問左子樹,再訪問樹根,最後訪問右子樹
後序遍歷:先訪問左子樹,再訪問右子樹,最後訪問樹根