二叉樹的遍歷
「遍歷」是任何型別均有的操作,
對線性結構而言,只有一條搜尋路
徑(因為每個結點均只有乙個後繼),
故不需要另加討論。而二叉樹是非
線性結構,
每個結點有兩個後繼,
則存在如何遍歷即按什麼樣的搜尋
路徑遍歷的問題。
對「二叉樹」而言,可以有兩條搜尋路徑:
1.先上後下的按層次遍歷;
2.先左(子樹)後右(子樹)的遍歷;
二、先左後右的遍歷演算法
先(根)序的遍歷演算法
中(根)序的遍歷演算法
後(根)序的遍歷演算法
先(根)序的遍歷演算法:
若二叉樹為空樹,則空操作;否則,
(1)訪問根結點;
(2)先序
遍歷左子樹;
(3)先序
遍歷右子樹。
列:前序遍歷序列:a b d c
中(根)序的遍歷演算法
若二叉樹為空樹,則空操作;否則,
(1)中序
遍歷左子樹;
(2)訪問根結點;
(3)中序
遍歷右子樹。
中序遍歷序列:bd a c
後(根)序的遍歷演算法:
若二叉樹為空樹,則空操作;否則,
(1)後序
遍歷左子樹;
(2)後序
遍歷右子樹;
(3)訪問根結點。
後序遍歷序列: d b c a
二:遍歷演算法的應用舉例
演算法的遞迴描述(先序遍歷)
void preorder ( bitree t )
}
1、統計二叉樹中葉子結點的個數演算法基本思想:先序(或中序或後序)遍歷二叉樹,在遍歷過程中查詢葉子結點,並計數。由此,需在遍歷演算法中增添乙個「計數」的引數,並將演算法中「訪問結點」的操作改為:若是葉子,則計數器增1。
void countleaf (bitree t, int& count) // if
} // countleaf
l將二叉樹分為五種形態進行討論:
求葉子結點個數
分析:① 0; ② 1; ③ l; ④ r; ⑤ l+r
簡化:③④⑤可合併成⑤
求葉子結點個數
int leafcount ( bintree bt )
2、求二叉樹的深度分析:① 0;② 1;
③ 1+l;
④ 1+r;
⑤ 1+max(l,r)。
簡化:②③④⑤可合併成⑤。
求二叉樹的深度
int depth ( bintree bt )
三:層次遍歷二叉樹
層次遍歷順序為:
ab c d e f
特點:
先被遍歷的結點的孩子先於後遍歷的結點的孩子遍歷
二叉樹 滿二叉樹和完全二叉樹
二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...