數據結構與算法學習之二叉樹及二叉樹的相關操作

樹中有一些概念需要我們瞭解,節點的度是指該節點子樹的個數,樹的度是指樹中節點度得最大值,一個樹的深度是指樹中節點最大層次值。二叉樹是數據結構中一種重要的結構,它有很多重要的性質:

1)二叉樹第i層上最多有2i-1個節點;

2)深度爲k的二叉樹各層節點總數最多爲2k-1;

3)在任意的二叉樹中,如果葉子節點個數爲n0,度爲1的節點個數爲n1,度爲2的節點的個數爲n2,則n2=n0+1;

4)具有n個節點的完全二叉樹,其樹的深度爲log2n向下取整再加1;

5)對有n個節點的二叉樹從1到n的順序進行編號,則對於編號爲i的節點(i>=1)有:

當i=1時,該節點爲樹根;

當i>1時,該節點的雙親節點爲i/2向下取整;

當2i<=n時,該節點有編號爲2i的的左孩子;

當2i+1<=n時,該節點有編號爲2i+1的右孩子。

此篇博客主要記載本人對二叉樹如何建立,遍歷的一些知識。

二叉樹的建立算法還是相對繁瑣的,這裏面主要介紹兩種二叉樹的簡歷方法:1)對樹中所有節點進行編號,輸入相應節點的數值的方法;2)使用遞歸的方式,按照遍歷的方式輸入樹節點的遍歷序列。

首先看看第一種方式,所需要輸入的信息有節點編號和節點存儲的數值,藉助一個輔助向量用於存儲指向每個節點的指針,具體算法如下:

當輸入的節點編號爲1時,此時它是根節點,同時將指向該節點的指針存放在s[1]中。

當輸入的節點編號i大於1時,先將其存入s[i]中,然後可以知道其雙親節點爲j=i/2;

如果i爲偶數,它是雙親的左孩子,則有s[j]->lchild=s[i];

如果i爲奇數,它是雙親的右孩子,則有s[j]->rchild=s[i];

這樣就可以輸入多個節點組成一個二叉樹,而且逐步將孩子與雙親節點建立連接。

第二種方式就是遞歸的建立二叉樹了:具體思路可以見後面的代碼。

建立好了二叉樹,我們最應該掌握的算法就是對二叉樹的遍歷了。

二叉樹的遍歷有先序遍歷,中序遍歷,後序遍歷和層序遍歷四種。有遞歸實現和非遞歸實現,這些我們都應該掌握。

 

上面的遍歷算法均爲遞歸的,非遞歸實現如下

二叉樹的操作除了建立和遍歷以外,還可以考察一些操作,比如統計一下樹中節點的總數,有多少個葉子節點,或者是問問樹的深度是多少之類的問題,下面是以上3個問題的C++代碼:

 

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章