樹是一類重要的非線性資料結構,是以分支關係定義的層次結構
定義:樹(tree)是n(n>=0)個結點的有限集t,其中:
n=0時為空樹
n>0時,有且僅有乙個特定的結點,稱為樹的根(root)
當n>1時,其餘結點可分為m(m>0)個互不相交的有限集t1,t2,……tm,
其中每乙個集合本身又是一棵樹,稱為根的子樹(subtree)
特點:非空樹中至少有乙個結點——根
樹中各子樹是互不相交的集合 基本
概念:結點(node)——表示樹中的元素,包括資料項及若干指向其子樹的分支
結點的度(degree)——結點擁有的子樹數
葉子(leaf)
——度為0的結點
孩子(child)——結點子樹的根稱為該結點的孩子
雙親(parents)——孩子結點的上層結點叫該結點的~
兄弟(sibling)——同一雙親的孩子
樹的度——一棵樹中最大的結點度數
結點的層次(level)——從根結點算起,根為第一層,它的孩子為第二層……
深度(depth)——樹中結點的最大層次數
森林(forest)——m(m>=0)棵互不相交的樹的集合
二叉樹
定義:二叉樹是n(n>=0)個結點的有限集,它或為空樹(n=0),或由乙個根結點和兩棵分別稱為
左子樹和右子樹的互不相交的樹構成
特點:
每個結點至多有二棵子樹(即不存在度大於2的結點)
二叉樹的子樹有左、右之分,且其次序不能任意顛倒
性質:
1.
在二叉樹的第i層至多有2i-1個結點(i>=1)
2.深度為k的二叉樹至多有2k-1個結點(k>=1)
3.對任何一棵二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1
證明:n1為二叉樹t中度為1的結點數
因為:二叉樹中所有結點的度均小於或等於2
所以:其結點總數n=n0+n1+n2
又二叉樹中,除根結點外,其餘結點都只有乙個分支進入
設b為分支總數,則n=b+1
又:分支由度為1和度為2的結點射出,即 b=n1+2n2
於是,n=b+1=n1+2n2+1=n0+n1+n2
即:n0=n2+1
滿二叉樹定義:
乙個深度為k,且有2k-1個結點的二叉樹
完全二叉樹
定義:深度為k,有n個結點的二叉樹當且僅當
其每乙個結點都
與深度為k的滿二叉樹中編號從1至n的結點一一對應
特點:葉子結點只可能在層次最大的兩層上出現
對任一結點,若其右分支下子孫的最大層次為i,則其左分支下子孫的最大層次必為i或i+1
性質:4
.具有k個結點的完全二叉樹,深度為(log
2k)向下取整再加一
性質:5.
如果對一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點i(1<=i<=n),有:
(1) 如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是i/2
(2) 如果2i>n,則結點i無左孩子;如果2i<=n,則其左孩子是2i
(3) 如果2i+1>n,則結點i無右孩子;如果2i+1<=n,則其右孩子是2i+1
二叉樹的遍歷
方法先序遍歷:先訪問根結點,然後分別先序遍歷左子樹、右子樹
中序遍歷:先中序遍歷左子樹,然後訪問根結點,最後中序遍歷右子樹
後序遍歷:先後序遍歷左、右子樹,然後訪問根結點
按層次遍歷:從上到下、從左到右訪問各結點
void printq(tree *t) //先序遍歷輸出
}void printz(tree *t) //中序遍歷輸出
}void printh(tree *t) //後序遍歷輸出
}
void ccbl(tree *t) //層次遍歷輸出
}
二叉樹 滿二叉樹與完全二叉樹
二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由乙個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每乙個元素都稱為結點。通常二叉樹的許多名...
樹與二叉樹
建立 先序二叉樹,中序二叉樹,後序二叉樹。給定兩種遍歷序列 前序中序或後序中序 重塑二叉樹 遍歷 判斷乙個節點是否存在於二叉樹中 二叉樹的遍歷 先序,中序,後序 遞迴 非遞迴 層次遍歷 從上到下或從下到上列印 zigzag遍歷方式層次遍歷 二叉樹性質 二叉樹中葉子節點的個數 二叉樹第k層節點數目 二...
樹與二叉樹
如圖所示 左邊就是乙個傳統的樹結構,右邊是乙個二叉樹。為何要有二叉樹呢?這是一種對傳統樹對表示方式,是為了便於程式對設計與實現。從左右兩個樹可以看到,任何形式對樹,都可以使用二叉樹來表示。這樣,通過 兒子 兄弟節點 這樣都資料結構,就可以表示二叉樹的每個節點。通過這樣的乙個45度的旋轉,又可以將二叉...