C語言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹、完全二叉樹的節(jié)點(diǎn)數(shù)計(jì)算詳解
一、基本概念
1.1 滿二叉樹
定義:高度為 h 的二叉樹,如果它有最大的節(jié)點(diǎn)數(shù)(2?-1個(gè)),則稱為滿二叉樹。
特征:
每一層都達(dá)到最大節(jié)點(diǎn)數(shù)
所有葉子都在最后一層
每個(gè)非葉子節(jié)點(diǎn)都有兩個(gè)子節(jié)點(diǎn)
沒有度為1的節(jié)點(diǎn)(要么0個(gè)子,要么2個(gè)子)

1.2 完全二叉樹
定義:高度為 h 的二叉樹,除第 h 層外,其他各層都達(dá)到最大節(jié)點(diǎn)數(shù),且第 h 層的節(jié)點(diǎn)都連續(xù)集中在最左邊。
特征:
葉子節(jié)點(diǎn)只在最后兩層
最后一層的葉子都靠左排列
度為1的節(jié)點(diǎn)最多只有1個(gè)
適合用數(shù)組存儲(chǔ)(沒有空洞)

1.3 兩種二叉樹對(duì)比
| 特性 | 滿二叉樹 | 完全二叉樹 |
|---|---|---|
| 度1節(jié)點(diǎn) | 總是0個(gè) | 0個(gè)或1個(gè) |
| 葉子位置 | 全在最后一層 | 最后兩層 |
| 節(jié)點(diǎn)公式 | N=2?-1 | 無簡單公式 |
| 葉子公式 | L=2??¹ | L=⌈N/2⌉ |
| 存儲(chǔ)效率 | 最高(無浪費(fèi)) | 高(數(shù)組存儲(chǔ)無空洞) |
| 常見應(yīng)用 | 理論分析、完美平衡 | 堆排序、優(yōu)先級(jí)隊(duì)列 |
二、代碼詳解
2.1 滿二叉樹計(jì)算
先檢查邊界:高度必須>0,否則直接返回
套用公式計(jì)算
按順序輸出:先總節(jié)點(diǎn),再葉子,然后度2,最后度1(總是0)
void fullBinaryTree(int height) {
if (height <= 0) return; // 第1步:參數(shù)檢查
// 第2步:核心計(jì)算
int total_nodes = pow(2, height) - 1; // 公式1:總節(jié)點(diǎn)數(shù) = 2^h - 1
int leaf_nodes = pow(2, height - 1); // 公式2:葉子數(shù) = 2^(h-1)
int degree2_nodes = leaf_nodes - 1; // 公式3:度2節(jié)點(diǎn) = 葉子數(shù) - 1
// 第3步:輸出結(jié)果
printf("\n高度為 %d 的滿二叉樹:\n", height);
printf("總節(jié)點(diǎn)數(shù): %d\n", total_nodes);
printf("葉子節(jié)點(diǎn)數(shù): %d\n", leaf_nodes);
printf("度2節(jié)點(diǎn): %d\n", degree2_nodes);
printf("度1節(jié)點(diǎn): 0\n"); // 第4步:滿二叉樹特性(無度1節(jié)點(diǎn))
}2.2 完全二叉樹計(jì)算
邊界檢查:節(jié)點(diǎn)數(shù)必須>0
依次計(jì)算:高度 → 葉子數(shù) → 度1節(jié)點(diǎn) → 度2節(jié)點(diǎn)(用減法)
簡潔輸出:直接顯示所有結(jié)果
void completeBinaryTree(int n) {
if (n <= 0) return; // 第1步:參數(shù)檢查
// 第2步:計(jì)算三個(gè)關(guān)鍵值
int h = (int)(log2(n)) + 1; // 公式1:高度 = ?log?n? + 1
int leaves = (n + 1) / 2; // 公式2:葉子數(shù) = ?n/2?
int degree1 = (n % 2 == 0) ? 1 : 0; // 公式3:度1節(jié)點(diǎn)(偶數(shù)1,奇數(shù)0)
int degree2 = n - leaves - degree1; // 公式4:度2節(jié)點(diǎn) = 總數(shù) - 葉子 - 度1
// 第3步:輸出結(jié)果
printf("\n%d個(gè)節(jié)點(diǎn)的完全二叉樹:\n", n);
printf("高度: %d\n", h);
printf("葉子數(shù): %d\n", leaves);
printf("度1節(jié)點(diǎn): %d\n", degree1);
printf("度2節(jié)點(diǎn): %d\n", degree2);
}2.3 主函數(shù)main
int main() {
// 1. 演示滿二叉樹
printf("== 滿二叉樹示例 ==");
fullBinaryTree(3); // 高度為3的滿二叉樹
// 2. 演示完全二叉樹
printf("\n== 完全二叉樹示例 ==");
completeBinaryTree(9); // 9個(gè)節(jié)點(diǎn)的完全二叉樹
return 0;
}
三、總結(jié)
這段二叉樹節(jié)點(diǎn)關(guān)系計(jì)算代碼體現(xiàn)了清晰的設(shè)計(jì)思路和實(shí)現(xiàn)邏輯。代碼采用模塊化設(shè)計(jì),將滿二叉樹和完全二叉樹的計(jì)算分別封裝為獨(dú)立函數(shù),每個(gè)函數(shù)功能單一、接口明確。
實(shí)現(xiàn)上直接應(yīng)用數(shù)學(xué)公式:滿二叉樹部分基于高度h推導(dǎo)所有節(jié)點(diǎn)數(shù),完全二叉樹部分基于節(jié)點(diǎn)總數(shù)n計(jì)算各項(xiàng)數(shù)值。關(guān)鍵算法包括高度計(jì)算中的對(duì)數(shù)運(yùn)算和類型轉(zhuǎn)換,葉子數(shù)計(jì)算中的整數(shù)除法技巧,以及度1節(jié)點(diǎn)數(shù)的奇偶判斷邏輯。
到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹、完全二叉樹的節(jié)點(diǎn)數(shù)計(jì)算的文章就介紹到這了,更多相關(guān)C語言滿二叉樹、完全二叉樹節(jié)點(diǎn)數(shù)計(jì)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過一個(gè)小例子來簡單理解C語言中的內(nèi)存空間管理
這篇文章主要介紹了通過一個(gè)小例子來簡單理解C語言中的內(nèi)存空間管理,涉及到堆和棧等數(shù)據(jù)結(jié)構(gòu)的基本知識(shí),需要的朋友可以參考下2015-11-11
C++實(shí)現(xiàn)簡單班級(jí)成績管理系統(tǒng)
利用Qt實(shí)現(xiàn)獲取計(jì)算機(jī)的硬件信息
使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小(最新推薦)

