二叉樹的廣義表反序列化

前言

個人小記


一、代碼

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NODE 10
#define MAX_LEN 100
#define key(n)(n)?(n->key):(-1)
typedef struct Node
{int key;struct Node* lchild,*rchild;
}Node;Node* init_node(int key)
{Node* node=(Node*)malloc(sizeof(Node));node->key=key;node->lchild=node->rchild=NULL;return node;
}Node* insert(Node* root,int key)
{if(root==NULL)return init_node(key);if(rand()%2)root->lchild=insert(root->lchild,key);else root->rchild=insert(root->rchild,key);return root;
}Node* getnewtree(Node* root,int n)
{for(int i=0;i<n;i++){root=insert(root,rand()%100);}return root;
}void clear(Node* root)
{if(root==NULL)return ;clear(root->lchild);clear(root->rchild);free(root);return ;
}char buff[MAX_LEN];
int len;
void __serial(Node* root)
{if(root==NULL)return ;len+=snprintf(buff+len,100,"%d",root->key);if(root->lchild==NULL&&root->rchild==NULL)return ;len+=snprintf(buff+len,100,"(");__serial(root->lchild);if(root->rchild){len+=snprintf(buff+len,100,",");__serial(root->rchild);}len+=snprintf(buff+len,100,")");return ;
}void serial(Node* root)
{memset(buff,0,sizeof(buff));len=0;__serial(root);return ;
}void output(Node* root)
{if(root==NULL)return ;printf("%d(%d,%d)\n",key(root),key(root->lchild),key(root->rchild));output(root->lchild);output(root->rchild);
}Node* diserial(char buff[],int n)
{Node* root=NULL;Node* p=NULL;int top=-1,state=0,fag=0;Node** stack=(Node**)malloc(sizeof(Node*)*MAX_NODE);for(int i=0;i<n;i++){switch(state){case 0:{if(buff[i]<='9'&&buff[i]>='0')state=1;if(buff[i]=='(')state=2;if(buff[i]==',')state=3;if(buff[i]==')')state=4;i--;}break;case 1:{int key=0;while(buff[i]<='9'&&buff[i]>='0'){key=key*10+(buff[i]-'0');i++;}p=init_node(key);if(fag==0&&top>=0)stack[top]->lchild=p;if(fag==1&&top>=0)stack[top]->rchild=p;i--;state=0;}break;case 2:{stack[++top]=p;fag=0;state=0;}break;case 3:{fag=1;state=0;}break;case 4:{root=stack[top--];state=0;}break;}}free(stack);
return root;
}int main()
{srand((unsigned)time(0));Node* root=NULL;root=getnewtree(root,MAX_NODE);serial(root);output(root);printf("廣義表為:\n");printf("%s\n",buff);Node* new_root=diserial(buff,len);printf("反序列化結果為:"\n);output(new_root);clear(root);clear(new_root);return 0;
}

二、結果

10(35,0)
35(41,2)
41(-1,25)
25(-1,-1)
2(-1,-1)
0(94,79)
94(65,-1)
65(-1,-1)
79(44,-1)
44(-1,-1)
廣義表為:
10(35(41(,25),2),0(94(65),79(44)))
反序列化結果為:
10(35,0)
35(41,2)
41(-1,25)
25(-1,-1)
2(-1,-1)
0(94,79)
94(65,-1)
65(-1,-1)
79(44,-1)
44(-1,-1)

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

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

相關文章

Leetcode 3159. Find Occurrences of an Element in an Array

Leetcode 3159. Find Occurrences of an Element in an Array 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3159. Find Occurrences of an Element in an Array 1. 解題思路 這一題的話我們只需要首先統計一下array當中目標元素x出現在第幾次的位置&#xff0c;構造一個has…

推薦13款常用的Vscode插件,提高前端日常開發效率

1. Live Server Live Server 插件是一個用于前端開發的擴展&#xff0c;它的主要作用是提供一個本地開發服務器&#xff0c;以便實時預覽和調試網頁應用程序。其最大特點在于熱重載&#xff0c;即開發者可實時預覽代碼效果。 因為Live Server 允許開發者在瀏覽器中實時預覽您正…

軟件測試面試題(五)

一&#xff1a;如何選擇用戶測試的工作產品&#xff1f;、 答&#xff1a;在用戶有需求得到簽字確認以后&#xff0c;我們選擇用戶測試的工作產品。我們幾乎所有的項目都進行了測試&#xff0c;我們是在項目立項公告中得知需要對工作產品進行測試。 二&#xff1a;測試環境描述…

C++中集合的使用

在 C 中&#xff0c;集合通常指的是標準模板庫&#xff08;STL&#xff09;中的 std::set 或 std::unordered_set。這兩個都是用來存儲不重復元素的容器&#xff0c;但在實現和使用方式上有一些區別。 1. std::set&#xff1a; 基于紅黑樹實現&#xff0c;元素按照嚴格的順序…

Llama 3沒能逼出GPT-5!OpenAI怒“卷”To B戰場,新企業級 AI 功能重磅推出!

Meta 是本周當之無愧的AI巨星&#xff01;剛剛推出的 Llama 3 憑借著強大的性能和開源生態的優勢在 LLM 排行榜上迅速躍升。 按理說&#xff0c;Llama 3在開源的狀態下做到了 GPT-3.7 的水平&#xff0c;必然會顯得用戶&#xff08;尤其是企業用戶&#xff0c;他們更具備獨立部…

指令中常用的7種尋址方式z

指令中的尋址方式就是對指令中的地址字段進行解釋&#xff0c;以獲得操作數的方法或獲得程序轉移地址的方法。常用的尋址方式有&#xff1a; 立即尋址&#xff1a;操作數就包含在指令中。直接尋址&#xff1a;操作數存放在內存單元中&#xff0c;指令中直接給出操作數所在存儲…

C#調用HttpClient.SendAsync報錯:System.Net.Http.HttpRequestException: 發送請求時出錯。

C#調用HttpClient.SendAsync報錯&#xff1a;System.Net.Http.HttpRequestException: 發送請求時出錯。 var response await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);問題出在SSL/TLS&#xff0c;Windows Server 2012不支持…

先進制造aps專題八 基于ai大模型的ai超級應用,ai生管

目前正在研發的面向消費者的ai超級應用有ai文員&#xff0c;ai教師&#xff0c;ai家教&#xff0c;ai護士&#xff0c;ai翻譯 而ai生管無疑是面向制造業的ai超級應用 從商業角度來說&#xff0c;ai生管&#xff0c;必然是aps公司必然要研發的ai超級應用

Grafana 路徑遍歷所有路徑 CVE-2021-43798漏洞預警

簡介? ?Grafana是一個跨平臺、開源的數據可視化網絡應用程序平臺。用戶配置連接的數據源之后&#xff0c;Grafana可以在網絡瀏覽器里顯示數據圖表和警告。 漏洞危害等級 高危 CVE 編號? CVE-2021-43798 FOFA查詢 ?app"Grafana" ?zoomeyes查詢 ?app:"gr…

Vue3解決“找不到模塊“@/components/xxx.vue”或其相應的類型聲明”

文章目錄 前言背景問題描述解決方案總結 前言 在使用 Vue 3 開發項目時&#xff0c;遇到“找不到模塊 ‘/components/xxx.vue’ 或其相應的類型聲明”的錯誤是一個常見問題。這通常與 TypeScript 和模塊解析相關的配置不當有關。本文將詳細介紹如何解決此問題&#xff0c;確保…

2024-6-遙遠的救世主

2024-6-遙遠的救世主 2024-4-18 豆豆 fatux&#xff1a; 2021.5.26 看完電視劇《天道》之后購買本書&#xff0c;斷斷續續一直沒有讀完。 非常好奇&#xff0c;一個什么樣的作者能寫出如此奇書。老丁&#xff0c;一個智者&#xff0c;智者是多么孤獨&#xff0c;因為找不到同…

信息安全等級保護測評: 登陸日志

文章目錄 引言I 登錄日志表結構設計II 日志處理2.1 封裝日志入庫2.2 收集登陸信息2.3 查詢接口引言 等保測評是信息安全等級保護測評的簡稱,是對信息和信息載體按照重要性等級分級別進行檢測、評估的過程。 背景:近期AIS監控平臺(網頁版)等保測評,發現沒有登陸日志,現要…

從用法到源碼再到應用場景:全方位了解CompletableFuture及其線程池

文章目錄 文章導圖什么是CompletableFutureCompletableFuture用法總結API總結 為什么使用CompletableFuture場景總結 CompletableFuture默認線程池解析&#xff1a;ForkJoinPool or ThreadPerTaskExecutor&#xff1f;ForkJoinPool 線程池ThreadPerTaskExecutor線程池Completab…

Qt 界面上字體自適應控件大小 - 隨控件縮放

Qt 界面上字體自適應控件大小 - 隨控件縮放 引言一、設計思路二、進階版大致思路三、參考鏈接 引言 Qt控件自適應字體大小可以用adjustSize()函數&#xff0c;但字體自適應控件大小并沒有現成的函數可調. - 本文實現了按鈕上的字體隨按鈕大小變化而變化 (如上圖所示) - 其他控件…

Spring MVC+mybatis 項目入門:旅游網(三)用戶注冊——控制反轉以及Hibernate Validator數據驗證

個人博客&#xff1a;Spring MVCmybatis 項目入門:旅游網&#xff08;三&#xff09;用戶注冊 | iwtss blog 先看這個&#xff01; 這是18年的文章&#xff0c;回收站里恢復的&#xff0c;現階段看基本是沒有參考意義的&#xff0c;技術老舊脫離時代&#xff08;2024年辣鐵鐵&…

澳大利亞.德國-門戶媒體投放通稿:需要注意什么地方

概述 在現代社會&#xff0c;新聞媒體的投放成為企業和組織宣傳推廣的重要手段之一。澳大利亞和德國作為全球重要的經濟和科技中心&#xff0c;其新聞媒體也備受關注。本文將介紹澳大利亞和德國的一些主要新聞媒體&#xff0c;并討論發表新聞稿時需要注意的地方。 澳大利亞媒…

streamlit 學習

表情網站 https://getemoji.com/ 官網&#xff1a; https://streamlit.io/ 文檔 https://docs.streamlit.io/develop/api-reference/chat/st.chat_message 安裝&#xff1a; pip install streamlit啟動 以下的python 文件指寫streamlit 程序的腳步。 1、先切換目錄到Pyth…

VMware虛擬機-設置系統網絡IP、快照、克隆

1.設置網絡IP 1.點擊右上角開關按鈕-》有線 已連接-》有線設置 2.手動修改ip 3.重啟或者把開關重新關閉開啟 2.快照設置 快照介紹&#xff1a; 通過快照可快速保存虛擬機當前的狀態&#xff0c;后續可以使用虛擬機還原到某個快照的狀態。 1.添加快照(需要先關閉虛擬機) 2.在…

[JAVASE] 類和對象(六) -- 接口(續篇)

目錄 一. Comparable接口 與 compareTo方法 1.1 Comparable接口 1.2 compareTo方法的重寫 1.2.1 根據年齡進行比較 1.2.2 根據姓名進行比較 1.4 compareTo 方法 的使用 1.3 compareTo方法的缺點(重點) 二. Comparator接口 與 compare方法 2.1 Comparator接口 2.2 compare 方法…

藍橋杯算法心得——李白打酒(加強版)

大家好&#xff0c;我是晴天學長&#xff0c;記憶化搜索&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以關注支持一下哦&#xff01;后續會繼續更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 2) .算法思路 1.memo三維表示記錄的結果 3&#xff09;.算法步驟 1…