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