树与二叉树(c/c++)
- 樹的特點:
結點的度:該結點擁有非空子樹的個數。樹的度:所有結點的度的最大值。層次:第一層為樹的根結點所在層,第二層為根的兒子所在層...。樹的高度(深度):樹的最大層次。結點的高度:從最深的葉子結點往上數起。結點的深度:從根結點數起
- 二叉樹:
二叉樹是遞歸定義的,其結點有左右孩子之分。
二叉樹有順序存儲和鏈式存儲兩種存儲結構,其中鏈式存儲最為常用,順序存儲結構適合用于完全二叉樹的存儲,將結點存儲在數組中,根據下面樹的性質4通過數組下標進行訪問,又如之前的堆排序中采用的就是完全二叉樹的順序存儲結構。
二叉樹的五種形態:1,空二叉樹? 2,只有一個根結點的二叉樹? 3,只有左子樹的二叉樹 ? 4 ? 只有右子樹的二叉樹 ?? 5? 完全二叉樹
二叉樹鏈式存儲結點定義如下:
typedef struct btNode {char data;//結點中的信息struct btNode* lc;//左孩子結點struct btNode* rc;//右孩子結點 }btNode;- 樹的性質:
1,總結點數=總分支數+1。可推在二叉樹中,n0+n1+n2=2*n2+n1+1 ? 得:n0=n2+1
2,n個結點的樹含有2n個指針,其中非空指針數位n-1,空指針數位n+1
3,二叉樹中第i層最多有2^(k-1)個結點,高(深)度為k的二叉樹中最多有2^k-1個結點
4,n個結點的完全二叉樹中,按從上至下,從左到右對數編號,根結點編號為1,則對于編號為i的結點:若i不等于1,那其雙親編號為i/2(向下取整);若2*i小于等于n,那其左孩子編號為2i;若2*i+1小于等于n,那其右孩子編號為2i+1。根結點編號為0的話:若i不等于0,那其雙親結點為i/2-1(向上取整);在其左右孩子存在的條件下,左孩子為2i+1,右孩子為2i+2
5,n個結點可以構成h(n)種不同的二叉樹,h(n)=C(2n,n)/(n+1),h(n)為卡特蘭數
6,n個結點完全二叉樹的高度為logn+1(logn向下取整)或log(n+1)(向上取整)
- 樹的三種存儲結構:
1,雙親表示法(樹編號從1開始,根結點的雙親結點(父結點)為-1)
typedef struct {char data;//結點中的信息int parent;//父結點 }node;2,孩子表示法(類似于圖的鄰接表表示法)
此處無代碼,無圖,讀者可自行想象。(有點懶...)
3,孩子兄弟表示法(用于樹與二叉樹的轉換,口訣為左孩子,右兄弟)
typedef struct node {char data;//結點中的信息struct node* son;//孩子結點struct node* brother;//孩子的兄弟結點 }node;樹的先序遍歷等同于其轉換二叉樹的先序遍歷;樹的后序遍歷等同于其轉換二叉樹的中序遍歷。森林的先序遍歷等同于其轉換二叉樹的先序遍歷;樹的中序遍歷等同于其轉換二叉樹的中序遍歷。
?
?
?
?
?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的树与二叉树(c/c++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基数排序(c/c++)
- 下一篇: 二叉树的递归遍历和层序遍历(c/c++)