數據結構實驗7.2:二叉樹的基本運算

文章目錄

  • 一,實驗目的
  • 二,問題描述
  • 三,基本要求
  • 四,實驗操作
  • 五,示例代碼
  • 六,運行效果


一,實驗目的

  1. 深入理解樹與二叉樹的基本概念,包括節點、度、層次、深度等,清晰區分二叉樹與一般樹的結構特點,為后續學習和應用打下堅實基礎。
  2. 熟練掌握用遞歸方法實現二叉樹的遍歷,通過遞歸算法的設計和實現,深刻體會遞歸思想在處理樹結構數據時的簡潔性和高效性,提高對遞歸算法的運用能力。
  3. 掌握借助棧或隊列實現二叉樹遍歷的非遞歸迭代方法,理解棧和隊列在模擬遞歸過程中的作用,培養利用數據結構解決問題的能力,拓寬算法設計思路。
  4. 熟練掌握構造Huffman樹、Huffman編碼等操作,理解Huffman樹的原理和應用場景,能夠根據給定的字符頻率構建最優的Huffman樹,并生成相應的Huffman編碼,提高對數據壓縮等實際問題的解決能力。
  5. 通過對二叉樹相關知識的學習和編程實踐,加深對二叉樹的理解,逐步培養運用二叉樹結構解決實際問題的編程能力,提升算法設計、調試和分析的綜合素養。

二,問題描述

編程實現二叉樹的下列基本運算。
(1)創建一棵二叉樹;
(2)求二叉樹中結點的總數;
(3)統計二叉樹的葉結點個數;
(4)求二叉樹的深度;
(5)用按層次順序遍歷二叉樹的方法,統計樹中具有度為1的結點數目;
(6)交換二叉樹每個結點的左孩子和右孩子;
(7)輸出二叉樹。

三,基本要求

(1)采用二叉鏈表作為二叉樹結點的存儲結構;
(2)設計實現上述各種運算的算法;
(3)設計主函數以完成對上述算法的調用,并輸出結果;
(4)完善參考程序;
(5)設計測試數據,上機調試、測試完善后的參考程序,保存并打印測試結果,對算法性能進行分析。

四,實驗操作

1,雙擊Visual Studio程序快捷圖標,啟動程序。
在這里插入圖片描述

2,之前創建過項目的話,直接打開即可,這里選擇【創建新項目】。
在這里插入圖片描述

3,單擊選擇【空項目】——單擊【下一步】按鈕。
在這里插入圖片描述

4,編輯好項目的名稱和存放路徑,然后單擊【創建】按鈕。
在這里插入圖片描述

5,創建C++程序文件,右擊【源文件】——選擇【添加】——【新建項】。
在這里插入圖片描述
6,輸入項目名稱,單擊【添加】按鈕。
在這里插入圖片描述

7,編寫代碼,單擊運行按鈕,運行程序。
在這里插入圖片描述

五,示例代碼

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>typedef struct BiTNode { 			// 定義二叉樹的結點結構char data;   					// 假定樹結點的元素類型為charstruct BiTNode* lchild; 			// 左指針struct BiTNode* rchild; 		// 右指針
} BiTNode, * BiTree;void CreateBiTree(BiTree& T)
{  // 先序遞歸遍歷方式創建一棵二叉樹char ch;scanf("\n%c", &ch);     								// 輸入根結點的值if (ch == '#') 											// 終止項T = NULL;else{T = (BiTree)malloc(sizeof(BiTNode)); 				// 創建根結點if (!T)exit(-1);T->data = ch;printf("\n請輸入%c結點的左子結點(#表無):", T->data); // 先序遍歷創建左子樹CreateBiTree(T->lchild);printf("\n請輸入%c結點的右子結點(#表無):", T->data); // 先序遍歷創建右子樹CreateBiTree(T->rchild);}
}//統計二叉樹的葉子結點個數。
int LeafNodeCount(BiTree T)
{if (T == NULL)return 0;                //如果是空樹,則葉子結點個數為0else if (T->lchild == NULL && T->rchild == NULL) // 判斷該結點是否是葉子結點(左孩子右孩子都為空),若是則返回1return 1;elsereturn LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}//交換二叉樹每個結點的左孩子和右孩子。
void ChangeLR(BiTree T)
{BiTree p;if (T == NULL || (T->lchild == NULL && T->rchild == NULL))return;else{p = T->lchild;T->lchild = T->rchild;T->rchild = p;}ChangeLR(T->lchild);ChangeLR(T->rchild); // 交換右子樹上結點的左右孩子
}
// 統計二叉樹中度為1的結點數
int D1_Nodes(BiTree T)
{int  num1, num2;if (T == NULL || (!T->lchild && !T->rchild))return 0;num1 = D1_Nodes(T->lchild);num2 = D1_Nodes(T->rchild);if (T->lchild && !T->rchild)	// 若結點T的左子樹非空,右子樹空,則返回左// 子樹上度為1的結點數加1(當前結點度為1)return num1 + 1;else if (!T->lchild && T->rchild)return num2 + 1;elsereturn num1 + num2;
}//求二叉樹結點數目
int Nodes(BiTree  T)
{int num1, num2;if (T == NULL)return 0;else {num1 = Nodes(T->lchild);				// 統計左子樹的結點數num2 = Nodes(T->rchild);				// 統計右子樹的結點數return num1 + num2 + 1; // 左右子樹結點總數加1(當前結點)}
}// 求二叉樹的深度
int BiTreeDepth(BiTree T)
{int leftdep, rightdep;if (T == NULL) // 終止項return 0;else{leftdep = BiTreeDepth(T->lchild);rightdep = BiTreeDepth(T->rchild);return (leftdep > rightdep) ? (leftdep + 1) : (rightdep + 1);}
}
//以括號表示格式輸出二叉樹
void OutputBiTree(BiTree T)
{		// 先序遞歸遍歷方式輸出括號表示的二叉樹if (T != NULL)									// 終止項{printf("%c", T->data);						// 訪問根結點if (T->lchild != NULL || T->rchild != NULL){printf("(");							// 根的孩子用圓括號對括OutputBiTree(T->lchild);				// 先序遍歷輸出左子樹if (T->rchild != NULL)printf(",");						// 根的左右孩子以“,”分隔OutputBiTree(T->rchild);				// 先序遍歷輸出右子樹printf(")");							// 根的孩子用圓括號對括}}
}void main()
{int n;BiTNode* proot; 						// 定義樹proot = NULL; 						// 初始化為空樹printf("請輸入根結點元素(#表無):");		// 創建二叉樹CreateBiTree(proot);printf("\n(1)二叉樹創建成功!其括號表示格式輸出:\n\t");OutputBiTree(proot);printf("\n");n = Nodes(proot);printf("(2)二叉樹結點總數是:%d\n", n);n = LeafNodeCount(proot);printf("(3)二叉樹的葉子結點數為:%d\n", n);n = BiTreeDepth(proot);printf("(4)二叉樹的深度是:%d\n", n);n = D1_Nodes(proot);printf("(5)二叉樹中度為1的結點數是:%d\n", n);ChangeLR(proot);printf("(6)交換所有結點的左右孩子后二叉樹括號表示法輸出:\n\t");OutputBiTree(proot);printf("\n");
}

六,運行效果

1,實驗測試效果。
在這里插入圖片描述

2,編寫代碼運行后的效果。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79662.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

直線軸承常規分類知多少?

直線軸承的分類方式多樣&#xff0c;以下是從材質、結構形狀和常規系列三個維度進行的具體分類&#xff1a; 按主要材質分類 外殼材質&#xff1a;常見的有不銹鋼&#xff0c;具有良好的耐腐蝕性&#xff0c;適用于一些對環境要求較高、易受腐蝕的工作場景&#xff1b;軸承…

websocket和SSE學習記錄

websocket學習記錄 websocket使用場景 即時聊天在線文檔協同編輯實施地圖位置 從開發角度來學習websocket開發 即使通信項目 通過node建立簡單的后端接口,利用fs&#xff0c; path&#xff0c; express app.get(*, (req, res) > {const assetsType req.url.split(/)[…

CUDA編程中影響性能的小細節總結

一、內存訪問優化 合并內存訪問&#xff1a;確保相鄰線程訪問連續內存地址&#xff08;全局內存對齊訪問&#xff09;。優先使用共享內存&#xff08;Shared Memory&#xff09;減少全局內存訪問。避免共享內存的Bank Conflict&#xff08;例如&#xff0c;使用padding或調整訪…

【雙指針】對撞指針 快慢指針 移動零

文章目錄 雙指針介紹對撞指針快慢指針283. 移動零解題思路算法思路算法流程雙指針介紹 ? 算法中的雙指針,并不一定是指我們平常在 c/c++ 使用的指針類型,更多時候其實是數組的下標等,因為它們也是有標識某個元素的功能,通常我們也就順其自然地稱其為 “指針” ! ? 常見…

數據結構0基礎學習堆

文章目錄 簡介公式建立堆函數解釋 堆排序O(n logn)topk問題 簡介 堆是一種重要的數據結構&#xff0c;是一種完全二叉樹&#xff0c;&#xff08;二叉樹的內容后面會出&#xff09;&#xff0c; 堆分為大小堆&#xff0c;大堆&#xff0c;左右結點都小于根節點&#xff0c;&am…

4.17--4.19刷題記錄(貪心)

第一部分&#xff1a;準備工作 代碼隨想錄中解釋為&#xff1a;貪心的本質是選擇每一階段的局部最優&#xff0c;從而達到全局最優。 而我的理解為&#xff1a;貪心實質上是具有最優子結構的一種算法。所有的解都能由當前最優的解組成。 第二部分&#xff1a;開始刷題 &…

學習筆記十七——Rust 支持面向對象編程嗎?

&#x1f9e0; Rust 支持面向對象編程嗎&#xff1f; Rust 是一門多范式語言&#xff0c;主要以 安全、并發、函數式、系統級編程為核心目標&#xff0c;但它同時也支持面向對象的一些關鍵特性&#xff0c;比如&#xff1a; 特性傳統 OOP&#xff08;如 Java/C&#xff09;Ru…

【Linux】43.網絡基礎(2.5)

文章目錄 2.4 TCP/UDP對比2.4.1 用UDP實現可靠傳輸(經典面試題) 2.5 TCP 相關實驗2.5.1 理解 listen 的第二個參數 2.4 TCP/UDP對比 我們說了TCP是可靠連接, 那么是不是TCP一定就優于UDP呢? TCP和UDP之間的優點和缺點, 不能簡單, 絕對的進行比較TCP用于可靠傳輸的情況, 應用于…

three.js與webgl在buffer上的對應關系

一、three.js的類名 最近開始接觸three.js 看到three.js中的一些類名和webgl的很相似 不自覺的就想對比一下 二、three.js中繪制4個點 // 創建點的幾何體 const vertices new Float32Array([0.0, 0.0, 0.0, // 點11.0, 0.0, 0.0, // 點20.0, 1.0, 0.0, // 點30.…

DataWhale AI春訓營 問題匯總

1.沒用下載訓練集導致出錯&#xff0c;爆錯如下。 這個時候需要去比賽官網下載對應的初賽訓練集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初賽訓練集.zip 在命令行執行這個命令解壓 2.沒定義測試集 te…

CANFD技術在新能源汽車通信網絡中的應用與可靠性分析

一、引言 新能源汽車產業正處于快速發展階段&#xff0c;其電子系統復雜度不斷攀升&#xff0c;涵蓋眾多傳感器、控制器與執行器。高效通信網絡成為確保新能源汽車安全運行與智能功能實現的核心要素。傳統CAN總線因帶寬限制&#xff0c;難以滿足高級駕駛輔助系統&#xff08;A…

Python字典深度解析:高效鍵值對數據管理指南

一、字典核心概念解析 1. 字典定義與特征 字典&#xff08;Dictionary&#xff09;是Python中??基于哈希表實現??的無序可變容器&#xff0c;通過鍵值對存儲數據&#xff0c;具有以下核心特性&#xff1a; ??鍵值對結構??&#xff1a;{key: value}形式存儲數據??快…

C++中unique_lock和lock_guard區別

目錄 1.自動鎖定與解鎖機制 2.靈活性 3.所有權轉移 4.可與條件變量配合使用 5.性能開銷 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都屬于標準庫 <mutex> 中的互斥鎖管理工具&#xff0c;用于簡化互斥鎖的使用并確保線程安全。但它們存在一些顯著區別…

Nvidia顯卡架構演進

1 簡介 顯示卡&#xff08;英語&#xff1a;Display Card&#xff09;簡稱顯卡&#xff0c;也稱圖形卡&#xff08;Graphics Card&#xff09;&#xff0c;是個人電腦上以圖形處理器&#xff08;GPU&#xff09;為核心的擴展卡&#xff0c;用途是提供中央處理器以外的微處理器幫…

下載electron 22.3.27 源碼錯誤集錦

下載步驟同 electron源碼下載及編譯_electron源碼編譯-CSDN博客 問題1 從github 下載 dugite超時&#xff0c;原因沒有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/進階搜索 思路: 首先,最初始想法,將我們需要枚舉的長木棍個數計算出來,在dfs中,我們先判斷,此時枚舉這根長木棍需要的長度是否為0,如果為0,我們就枚舉下一個根木棍,接著再判斷,此時仍需要枚舉的木棍個數是否為0,如果為0,代表我們這種方案可行,直接打印長木棍長度,接著我們…

Linux教程-常用命令系列二

文章目錄 1. 系統管理常用命令1. useradd - 創建用戶賬戶功能基本用法常用選項示例 2. passwd - 管理用戶密碼功能基本用法常用選項示例 3. kill - 終止進程功能基本用法常用信號示例 4. date - 顯示和設置系統時間功能基本用法常用選項時間格式示例 5. bc - 高精度計算器功能基…

18、TimeDiff論文筆記

TimeDiff **1. 背景與動機****2. 擴散模型基礎****3. TimeDiff 模型****3.1 前向擴散過程****3.2 后向去噪過程** 4、TimeDiff&#xff08;架構&#xff09;原理訓練推理其他關鍵點解釋 DDPM&#xff08;相關數學&#xff09;1、正態分布2、條件概率1. **與多個條件相關**&…

整合SSM——(SpringMVC+Spring+Mybatis)

目錄 SSM整合 創建項目 導入依賴 配置文件 SpringConfig MyBatisConfig JdbcConfig ServletConfig SpringMvcConfig 功能模塊 測試 業務層接口測試 控制層測試 SSM是Java Web開發中常用的三個主流框架組合的縮寫&#xff0c;分別對應Spring、Spring MVC、MyBatis…

P1042【深基8,例1】乒乓球

【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革&#xff0c;以推動乒乓球運動在全球的普及。其中 11 分制改革引起了很大的爭議&#xff0c;有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…