1. 程式人生 > >第五章數據結構--樹--學習小結

第五章數據結構--樹--學習小結

後序 個性 -- 無法 高度 方法 一個 oid tro

這兩周我們主要學到了有關樹和二叉樹的用法,掌握了二叉樹的遍歷的基本操作,但是對一些具體題目來說,還是覺得有點難以上手。

樹的介紹

1. 樹的定義

樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:

(01) 每個節點有零個或多個子節點;
(02) 沒有父節點的節點稱為根節點;
(03) 每一個非根節點有且只有一個父節點;
(04) 除了根節點外,每個子節點可以分為多個不相交的子樹。

2. 樹的基本術語

若一個結點有子樹,那麽該結點稱為子樹根的"雙親",子樹的根是該結點的"孩子"。有相同雙親的結點互為"兄弟"。一個結點的所有子樹上的任何結點都是該結點的後裔。從根結點到某個結點的路徑上的所有結點都是該結點的祖先。

結點的度:結點擁有的子樹的數目。
葉子:度為零的結點。
分支結點:度不為零的結點。
樹的度:樹中結點的最大的度。

層次:根結點的層次為1,其余結點的層次等於該結點的雙親結點的層次加1。
樹的高度:樹中結點的最大層次。
無序樹:如果樹中結點的各子樹之間的次序是不重要的,可以交換位置。
有序樹:如果樹中結點的各子樹之間的次序是重要的, 不可以交換位置。
森林:0個或多個不相交的樹組成。對森林加上一個根,森林即成為樹;刪去根,樹即成為森林。

二叉樹的介紹

1. 二叉樹的定義

二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空

2. 二叉樹的性質

二叉樹有以下幾個性質:
性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。
性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)。
性質3:包含n個結點的二叉樹的高度至少為log2 (n+1)
性質4:在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1

遍歷

這裏講解前序遍歷中序遍歷後序遍歷3種方式。

1.前序遍歷

若二叉樹非空,則執行以下操作:
(01) 訪問根結點;
(02) 先序遍歷左子樹;
(03) 先序遍歷右子樹。

前序遍歷代碼

技術分享圖片 技術分享圖片
void preorder_bstree(BSTree tree)
{
    if(tree != NULL)
    {
      cout<<tree->data;
        preorder_bstree(tree->left);
        preorder_bstree(tree->right);
    }
}
技術分享圖片 技術分享圖片

2.2 中序遍歷

若二叉樹非空,則執行以下操作:
(01) 中序遍歷左子樹;
(02) 訪問根結點;
(03) 中序遍歷右子樹。

2.中序遍歷代碼

技術分享圖片 技術分享圖片
void inorder_bstree(BSTree tree)
{
    if(tree != NULL)
    {
        inorder_bstree(tree->left);
  cout<<tree->data;
inorder_bstree(tree->right); } }
技術分享圖片 技術分享圖片

2.3 後序遍歷

若二叉樹非空,則執行以下操作:
(01) 後序遍歷左子樹;
(02) 後序遍歷右子樹;
(03) 訪問根結點。

3.後序遍歷代碼

技術分享圖片 技術分享圖片
void postorder_bstree(BSTree tree)
{
    if(tree != NULL)
    {
        postorder_bstree(tree->left);
        postorder_bstree(tree->right);
  cout<<tree->data;
} }
技術分享圖片 技術分享圖片

做題時遇到的困難:例如在做樹的同構這道題目時,雖然知道基本的思路,但是在實際敲代碼的時候,將幾個算法整合在一起時常常會遇到困難,在BuildTree函數中經常報錯,導致無法將所有的數據輸入,整個程序就停止運行了。

解決方法:借鑒班上同學發布的博客,認真閱讀,理解他的思路,最終發現自己少了個循環輸入!還好及時解決了。

下周目標:認真復習有關圖的知識,鞏固上節課老師講過的知識點,進而解決PTA上面的題目,同時多找一些題目練手。

第五章數據結構--樹--學習小結