樹實驗代碼

哈夫曼樹

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100typedef struct {int weight;int lchild, rchild, parent;
} HTNode;typedef HTNode HT[MAXLEN];
int n;void CreatHFMT(HT T);
void InitHFMT(HT T);
void InputWeight(HT T);
void SelectMin(HT T, int i, int *p1, int *p2);
void PrintHFMT(HT T);
void hfnode(HT T, int i, int j);
void haffmannode(HT T);int main() {HT HT;CreatHFMT(HT);PrintHFMT(HT);haffmannode(HT);return 0;
}void CreatHFMT(HT T) {int i, p1, p2;InitHFMT(T);InputWeight(T);for (i = n; i < 2 * n - 1; i++) {SelectMin(T, i - 1, &p1, &p2);T[p1].parent = T[p2].parent = i;T[i].lchild = p1;T[i].rchild = p2;T[i].weight = T[p1].weight + T[p2].weight;}
}void InitHFMT(HT T) {int i;printf("\n請輸入共有多少個權值(小于100):");scanf("%d", &n);for (i = 0; i < 2 * n - 1; i++) {T[i].weight = 0;T[i].lchild = -1;T[i].rchild = -1;T[i].parent = -1;}
}void InputWeight(HT T) {int w, i;for (i = 0; i < n; i++) {printf("輸入第%d個權值:", i + 1);scanf("%d", &w);getchar();T[i].weight = w;}
}void SelectMin(HT T, int i, int *p1, int *p2) {long min1 = 888888, min2 = 888888;int j;for (j = 0; j <= i; j++) {if (T[j].parent == -1) {if (min1 > T[j].weight) {min1 = T[j].weight;*p1 = j;}}}for (j = 0; j <= i; j++) {if (T[j].parent == -1) {if (min2 > T[j].weight && j != (*p1)) {min2 = T[j].weight;*p2 = j;}}}
}void PrintHFMT(HT T) {int i;printf("哈夫曼樹的各邊顯示:\n");for (i = 0; i < 2 * n - 1; i++) {if (T[i].lchild != -1) {printf("(%d,%d),(%d,%d)\n", T[i].weight, T[T[i].lchild].weight, T[i].weight, T[T[i].rchild].weight);}}
}void hfnode(HT T, int i, int j) {j = T[i].parent;if (T[j].rchild == i) {printf("1");} else {printf("0");}if (T[j].parent != -1) {hfnode(T, j, i);}
}void haffmannode(HT T) {int i, j;printf("\n輸入權值的對應哈夫曼編碼:\n");for (i = 0; i < n; i++) {printf("%d的編碼為: ", T[i].weight);hfnode(T, i, -1); // -1 表示遞歸的初始狀態printf("\n");}printf("\n ");
}

運行結果

二叉樹

#include <stdio.h>
#include <malloc.h>
#define  MAX  100
int  count = 0;                   /*定義計算結點個數的變量*/
typedef  struct  tnode
{char  data;struct  tnode* lchild, * rchild;
}BT;BT* CreateBTree()
{BT* t;char  ch;scanf("%c", &ch);getchar();if (ch == '0')t = NULL;else{t = (BT*)malloc(sizeof(BT));t->data = ch;printf("請輸入%c結點的左孩子結點:", t->data);t->lchild = CreateBTree();printf("請輸入%c結點的右孩子結點:", t->data);t->rchild = CreateBTree();}return  t;
}void ShowBTree(BT* T)                     /*用廣義表表示法顯示二叉樹*/
{if (T != NULL)                          /*當二叉樹非空時*/{printf("%c", T->data);             /*輸入該結點數據域*/if (T->lchild != NULL)               /*若其左子樹非空*/{printf("(");                  /*輸入左括號*/ShowBTree(T->lchild);         /*遞歸調用該函數輸出其左子樹各結點*/if (T->rchild != NULL)           /*若其右子樹非空*/{printf(",");             /*輸出逗號*/ShowBTree(T->rchild);    /*遞歸調用該函數輸出其右子樹各結點*/}printf(")");}elseif (T->rchild != NULL)              /*二叉樹左子樹為空,右子樹不為空時*/{printf("(");                  /*輸入左括號*/ShowBTree(T->lchild);         /*遞歸調用該函數輸出其左子樹各結點*/if (T->rchild != NULL)           /*若其右子樹非空*/{printf(",");              /*輸出逗號*/ShowBTree(T->rchild);     /*遞歸調用該函數輸出其右子樹各結點*/}printf(")");}}
}void  PreOrder(BT* T)                      /* 先序遍歷二叉樹T*/
{if (T == NULL)  return;                    /* 遞歸調用的結束條件*/else{printf("%c", T->data);                /* 輸出結點的數據域*/PreOrder(T->lchild);                 /* 先序遞歸遍歷左子樹*/PreOrder(T->rchild);                 /* 先序遞歸遍歷右子樹*/}
}void  InOrder(BT* T)                       /* 中序遍歷二叉樹T*/
{if (T == NULL) return;                       /* 遞歸調用的結束條件*/else{InOrder(T->lchild);                    /* 中序遞歸遍歷左子樹*/printf("%c", T->data);                  /* 輸出結點的數據域*/InOrder(T->rchild);                    /* 中序遞歸遍歷右子樹*/}
}void  PostOrder(BT* T)                      /* 后序遍歷二叉樹T*/
{if (T == NULL) return;                     /* 遞歸調用的結束條件*/else{PostOrder(T->lchild);                 /* 后序遞歸遍歷左子樹*/PostOrder(T->rchild);                 /* 后序遞歸遍歷右子樹*/printf("%c", T->data);                 /* 輸出結點的數據域*/}
}void LevelOrder(BT* T)                      /*按層次遍歷二叉樹T*/
{int  f, r;                                /*定義隊頭隊尾指針*/BT* p, * q[MAX];                          /*定義循環隊列,存放結點指針*/p = T;if (p != NULL)                              /*若二叉樹非空,則根結點地址入隊*/{f = 1;  q[f] = p; r = 2;}while (f != r)                              /*隊列不空時*/{p = q[f];printf("%c", p->data);                 /*訪問隊首結點的數據域*/if (p->lchild != NULL)                   /*將隊首結點的左孩子入隊*/{q[r] = p->lchild;  r = (r + 1) % MAX;}if (p->rchild != NULL)                   /*將隊首結點的右孩子入隊*/{q[r] = p->rchild;  r = (r + 1) % MAX;}f = (f + 1) % MAX;}
}void  Leafnum(BT* T)                                   /*求二叉樹葉子結點數*/
{if (T)                                              /*若樹不為空*/{if (T->lchild == NULL && T->rchild == NULL)count++;                                         /*全局變量count為計數值,其初值為0*/Leafnum(T->lchild);                                  /*遞歸統計T的左子樹葉子結點數*/Leafnum(T->rchild);                                  /*遞歸統計T的右子樹葉子結點數*/}
}void  Nodenum(BT* T)
{if (T)                                   /*若樹不為空*/{count++;                            /*全局變量count為計數值,其初值為0*/Nodenum(T->lchild);                 /*遞歸統計T的左子樹結點數*/Nodenum(T->rchild);                 /*遞歸統計T的右子樹結點數*/}
}int  TreeDepth(BT* T)                      /*求二叉樹深度*/
{int  ldep = 0, rdep = 0;                     /*定義兩個整型變量,用以存放左、右子樹的深度*/if (T == NULL)return  0;else{ldep = TreeDepth(T->lchild);          /*遞歸統計T的左子樹深度*/rdep = TreeDepth(T->rchild);          /*遞歸統計T的右子樹深度*/if (ldep > rdep)return  ldep + 1;elsereturn  rdep + 1;}
}void  MenuTree()                                     /*顯示菜單子函數*/
{printf("\n                  二叉樹子系統");printf("\n =================================================");printf("\n|               1——建立一個新二叉樹            |");printf("\n|               2——廣義表表示法顯示            |");printf("\n|               3——先序遍歷                    |");printf("\n|               4——中序遍歷                    |");printf("\n|               5——后序遍歷                    |");printf("\n|               6——層次遍歷                    |");printf("\n|               7——求葉子結點數目              |");printf("\n|               8——求二叉樹總結點數目          |");printf("\n|               9——求樹深度                    |");printf("\n|               0——返回                        |");printf("\n ================================================");printf("\n請輸入菜單號(0-9):");
}main()
{BT* T = NULL;char  ch1, ch2, a;ch1 = 'y';while (ch1 == 'y' || ch1 == 'Y'){MenuTree();scanf("%c", &ch2);getchar();switch (ch2){case  '1':printf("請按先序序列輸入二叉樹的結點:\n");printf("說明:輸入結點后按回車('0'表示后繼結點為空):\n");printf("請輸入根結點:");T = CreateBTree();printf("二叉樹成功建立!"); break;case  '2':printf("二叉樹廣義表表示法如下:");ShowBTree(T); break;case  '3':printf("二叉樹的先序遍歷序列為:");PreOrder(T); break;case  '4':printf("二叉樹的中序遍歷序列為:");InOrder(T); break;case  '5':printf("二叉樹的后序遍歷序列為:");PostOrder(T); break;case  '6':printf("二叉樹的層次遍歷序列為:");LevelOrder(T); break;case  '7':count = 0; Leafnum(T);printf("該二叉樹有%d個葉子。", count); break;case  '8':count = 0; Nodenum(T);printf("該二叉樹共有%d個結點。", count); break;case  '9':printf("該二叉樹的深度是%d。", TreeDepth(T)); break;case  '0':ch1 = 'n'; break;default:printf("輸入有誤,請輸入0-9進行選擇!");}if (ch2 != '0'){printf("\n按回車鍵繼續,按任意鍵返回主菜單!\n");a = getchar();if (a != '\xA'){getchar(); ch1 = 'n';}}}
}

?運行結果

?

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

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

相關文章

【算法專題】分治 - 快速排序

分治 - 快速排序 分治 - 快速排序1. 顏色分類2. 排序數組(快速排序)3. 數組中的第K個最大元素4. 庫存管理Ⅲ5. 排序數組(歸并排序)6. 交易逆序對的總數7. 計算右側小于當前元素的個數8. 翻轉對 分治 - 快速排序 1. 顏色分類 做題鏈接 -> Leetcode -75.顏色分類 題目&…

【華為數據之道學習筆記】3-5 規則數據治理

在業務規則管理方面&#xff0c;華為經常面對“各種業務場景業務規則不同&#xff0c;記不住&#xff0c;找不到”“大量規則在政策、流程等文件中承載&#xff0c;難以遵守”“各國規則均不同&#xff0c;IT能否一國一策、快速上線”等問題。 規則數據是結構化描述業務規則變量…

【Qt開發流程】之UI風格、預覽及QPalette使用

概述 一個優秀的應用程序不僅要有實用的功能&#xff0c;還要有一個漂亮美膩的外觀&#xff0c;這樣才能使應用程序更加友善、操作性良好&#xff0c;更加符合人體工程學。作為一個跨平臺的UI開發框架&#xff0c;Qt提供了強大而且靈活的界面外觀設計機制&#xff0c;能夠幫助…

利用Rclone將阿里云對象存儲遷移至雨云對象存儲的教程,對象存儲數據遷移教程

使用Rclone將阿里云對象存儲(OSS)的文件全部遷移至雨云對象存儲(ROS)的教程&#xff0c;其他的對象存儲也可以參照本教程。 Rclone簡介 Rclone 是一個用于和同步云平臺同步文件和目錄命令行工具。采用 Go 語言開發。 它允許在文件系統和云存儲服務之間或在多個云存儲服務之間…

STM32-EXTI外部中斷

目錄 一、中斷系統 二、STM32中斷 三、NVIC&#xff08;嵌套中斷向量控制器&#xff09;基本結構 四、NVIC優先級分組 五、EXTI外部中斷 5.1 外部中斷基本知識 5.2 外部中斷&#xff08;EXTI&#xff09;基本結構 ?編輯 5.2.1開發步驟&#xff1a; 5.3 AFIO復用IO口…

ADAudit Plus:強大的網絡安全衛士

隨著數字化時代的不斷發展&#xff0c;企業面臨著越來越復雜和多樣化的網絡安全威脅。在這個信息爆炸的時代&#xff0c;保護組織的敏感信息和確保網絡安全已經成為企業發展不可或缺的一環。為了更好地管理和監控網絡安全&#xff0c;ADAudit Plus應運而生&#xff0c;成為網絡…

ThreadLocal系列-ThreadLocalMap源碼

1.ThreadLocalMap.Entry key&#xff1a;指向key的是弱引用 value&#xff1a;強引用 public class ThreadLocal<T> {static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always…

32、卷積參數 - 長寬方向的公式推導

有了前面三節的卷積基礎 padding, stride, dilation 之后,大概就可以了解一個卷積算法的全貌了。 一個完整的卷積包含的輸入和輸出有: 輸入圖像,表示為[n, hi, wi, ci] 卷積核,表示為[co, kh, kw, ci] 輸出特征圖,表示為[n, ho, wo, co] 以上為卷積算法的兩個輸入 tensor…

【持更】python數據處理-學習筆記

1、讀取excel /csv及指定sheet&#xff1a; pd.read_excel("路徑",sheetname"xx") 修改列名df.rename 修改字符串類型到數字 pandas.to_numeric&#xff08;&#xff09; 2、刪除drop、去重drop_duplicates &#xff08;1&#xff09;空值所在行/列 行&am…

Redis分布式鎖有什么缺陷?

Redis分布式鎖有什么缺陷&#xff1f; Redis 分布式鎖不能解決超時的問題&#xff0c;分布式鎖有一個超時時間&#xff0c;程序的執行如果超出了鎖的超時時間就會出現問題。 1.Redis容易產生的幾個問題&#xff1a; 2.鎖未被釋放 3.B鎖被A鎖釋放了 4.數據庫事務超時 5.鎖過期了…

centos 7 卸載圖形化界面步驟記錄

centos7 服務器操作系統&#xff0c;挺小一配置&#xff0c;裝了圖形化界面&#xff0c;現在運行程序的時候跑不動了&#xff0c;我想這圖形界面也沒啥用&#xff0c;卸載了算了&#xff01; 卸載步驟 yum grouplist 查詢已經安裝的組件 可以看到 圖形化界面 等是以分組存在的…

深入理解Spring IOC的工作流程

理解Spring IOC&#xff08;Inversion of Control&#xff09;的工作流程是理解Spring框架的核心之一。下面是Spring IOC的基本工作流程&#xff1a; 配置&#xff1a; 開發者通過XML配置文件、Java配置類或者注解等方式&#xff0c;定義應用中的Bean以及它們之間的依賴關系。這…

TCP數據粘包的處理

TCP數據粘包的處理 背鍋俠TCP解決方案2.1 發送端2.2 接收端 背鍋俠TCP 在前面介紹套接字通信的時候說到了TCP是傳輸層協議&#xff0c;它是一個面向連接的、安全的、流式傳輸協議。因為數據的傳輸是基于流的所以發送端和接收端每次處理的數據的量&#xff0c;處理數據的頻率可…

Qt練習題

1.使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否…

代碼隨想錄 96. 不同的二叉搜索樹

題目 給你一個整數 n &#xff0c;求恰由 n 個節點組成且節點值從 1 到 n 互不相同的 二叉搜索樹 有多少種&#xff1f;返回滿足題意的二叉搜索樹的種數。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;5 示例 2&#xff1a; 輸入&#xff1a;n 1 輸出&#xff1…

【Angular開發】Angular 16發布:發現前7大功能

Angular 于2023年5月3日發布了主要版本升級版Angular 16。作為一名Angular開發人員&#xff0c;我發現這次升級很有趣&#xff0c;因為與以前的版本相比有一些顯著的改進。 因此&#xff0c;在本文中&#xff0c;我將討論Angular 16的前7個特性&#xff0c;以便您更好地理解。…

機器學習基礎介紹

百度百科&#xff1a; 機器學習是一門多領域交叉學科&#xff0c;涉及概率論、統計學、逼近論、凸分析、算法復雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為&#xff0c;以獲取新的知識或技能&#xff0c;重新組織已有的知識結構使之不斷改善自身的性能。 …

手工酸奶店如何選址?開在哪里比較合適?

手工酸奶店是一個非常受歡迎的創業項目&#xff0c;但想要成功開店&#xff0c;選址是非常重要的。 本人開酸奶店5年時間&#xff0c;下面我將為大家分享一些選址的小技巧&#xff0c;希望對大家有所幫助。&#xff08;可以點贊收藏&#xff0c;方便以后隨時查閱&#xff09; …

入職字節外包一個月,我離職了。。。

有一種打工人的羨慕&#xff0c;叫做“大廠”。 真是年少不知大廠香&#xff0c;錯把青春插稻秧。 但是&#xff0c;在深圳有一群比大廠員工更龐大的群體&#xff0c;他們頂著大廠的“名”&#xff0c;做著大廠的工作&#xff0c;還可以享受大廠的伙食&#xff0c;卻沒有大廠…

12.11 C++ 作業

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&#xf…