第五章數據結構--樹--學習小結
這兩周我們主要學到了有關樹和二叉樹的用法,掌握了二叉樹的遍歷的基本操作,但是對一些具體題目來說,還是覺得有點難以上手。
樹的介紹
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上面的題目,同時多找一些題目練手。
第五章數據結構--樹--學習小結