1. 程式人生 > >遍歷二叉樹的應用:輸出二叉樹所有葉結點和求高度

遍歷二叉樹的應用:輸出二叉樹所有葉結點和求高度

利用二叉樹的遍歷方法,我們可以求得一棵二叉樹的很多東西,例如我們可以遍歷求得一棵二叉樹的所有葉結點,到我們找到一個結點的左右子樹都為空了,它就是其中一個葉結點,我們把它儲存起來,在遍歷完一棵二叉樹後,我們就可以找到所有的葉結點。同理,我們也可以通過遍歷一棵二叉樹的所有節點後,求出一棵二叉樹的高度。

首先我們來看如何用先序遍歷的方式求得一棵二叉樹的所有葉結點。我們可以用遞迴思想,就像遍歷一樣的遞迴方法,只是改變其中的一些條件。回顧一下遞迴遍歷的方法是隻要結點存在就輸出,而現在我們要遍歷找出葉結點,葉結點的與其他結點的區別就在於葉結點的左右子樹都為空,所以在遞迴遍歷時我們就可以加上一個條件:判斷當結點的左右子樹都為空時才輸出結點,這樣就可以通過遍歷找出所有葉結點了。程式碼也和遍歷的程式碼相似:

61行用一個if判斷如果(BT>Left==NULL && BT>Right==NULL)也就是判斷如果左子樹和右子樹都為空的話,就訪問輸出結點的Data,否則就遞迴遍歷左子樹和右子樹。

同理我們可以改變這條判斷結點左右子樹是否為空的語句的位置,得到中序遍歷方式和後序遍歷方式輸出所有葉結點的程式碼:


接下來到求一棵二叉樹的高度。求一棵二叉樹的高度,我們可以這樣想,一棵二叉樹的高度,等於根結點的左或右子樹的最高的高度再加一。也就是說,如果根左子樹高度比右子樹高,那麼該二叉樹的高度等於左子樹的高度加一,如果右子樹的高度比左子樹高,那麼二叉樹的高度就等於右子樹的高度加一。所以,我們可以通過遞迴遍歷完一個二叉樹的所有左子樹和右子樹,得到該二叉樹的所有左子樹的最大高度和右子樹的最大高度,比較後取高度大的值,然後加一就可以得到一棵二叉樹的高度了。那麼方法是如何實現?同樣是遞迴的方法,因為我們先把左右子樹都遍歷完一遍後再通過比較取得高度的最大值,所以可以通過改變二叉樹的後序遍歷的程式碼來實現求得二叉樹的高度:

我們定義變數max來儲存最大高度,LHRH分別表示左子樹的高度和右子樹的高度,第63行通過遞迴遍歷左子樹,獲得左子樹的高度,然後遞迴遍歷右子樹獲得右子樹的高度,接著6571行就判斷左子樹的高度和右子樹的高度,數值更大的那個就賦給max,最後72returnmax+1),就得到一棵二叉樹的高度了。