算法 {K叉树, 完整K叉树, 二叉树}
K叉樹
定義
每個節點最多有K(>=2
)個兒子的樹;
性質
#滿K叉樹perfect binary tree
#
所有葉子節點的深度都相同的 完整K叉樹;
性質
深度為D的節點個數 最多有
K
D
K^D
KD個;
即滿K叉樹的每個深度的節點個數是1, K, K*K, K*K*K, ...
; 即滿K叉樹的總節點個數一定為1/ 1+K/ 1+K+K*K/ ...
;
满K叉树
定义
设深度为H, 则第i
层的节点个数为K^i
;
完整K叉樹
定義
#完整K叉樹full/proper binary tree
#
所有非葉子節點都有K個兒子;
性質
#完整K叉樹 有 x x x個非葉子節點, 則該樹有 x ∗ K x*K x∗K條邊#
@DELI;
#完整K叉樹的節點個數#
任意完整K叉樹的節點個數 一定為
x
∗
K
+
1
x * K + 1
x∗K+1 其中x= 0/1/2/3/...
;
任意完整K叉樹的葉子節點個數 一定為
x
∗
(
K
−
1
)
+
1
x * (K-1) + 1
x∗(K−1)+1 其中x= 0/1/2/3/...
;
證明: 將完整K叉樹的所有葉子節點去掉, 剩下的這個樹
R
T
RT
RT 就是個K叉樹(不一定是完整K叉樹), 他倆是雙向的 即任意一個完整K叉樹 他的RT樹 一個是K叉樹, 任意一個K叉樹 一定可以是某個完整K叉樹的RT樹; 因此我們的思路 首先從所有的(非葉子幾點)入手;
.
對於一個有
x
x
x個節點的K叉樹, 對應上面的RT 即這
x
x
x個節點 都是完整K叉樹裡的非葉子節點, 將這個樹 添加邊 使其變成一個完整K叉樹, 因為這
x
x
x個節點 都是非葉子節點 所以他一定有
x
∗
K
x*K
x∗K邊(每個節點有K個兒子), 即整個樹有
x
∗
K
+
1
x*K + 1
x∗K+1個點, 其中有
x
∗
K
+
1
−
x
x*K+1 - x
x∗K+1−x個葉子節點;
即对于完整K叉树, 令x
为其叶子節點的個數, y
為其非葉子節點的個數, 那麼 x與y 是有線性關聯的, 即x確定了 y也就確定了 反之亦然; 同時 完整K叉樹的總節點個數確定了 那麼其x,y
值也就確定了;
.
也就是 所有完整K叉樹 一定是(x=(K-1)*y+1, y=任意>=0的整數)
;
二叉樹
定義
K=2
叉樹
完全二叉樹
定義
設二叉樹的深度為H, 如果前H-1
層的子樹 是滿二叉樹, 且第H
層的所有葉子節點 是從最左側開始連續的, 則該二叉樹是完全二叉樹;
性質
節點個數一旦確定, 則完全二叉樹的樹形態 是唯一的;
@DELI;