C/C++ 資料結構練習題1
題目描述:
判斷兩序列是否為同一二叉搜尋樹序列- 輸入:
-
開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。
接下去一行是一個序列,序列長度小於10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。
接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。
- 輸出:
-
如果序列相同則輸出YES,否則輸出NO
- 樣例輸入:
-
2 567432 543267 576342 0
- 樣例輸出:
-
YES NO
#include<stdio.h>
#include<string.h>
struct
Node{
//樹結點結構
Node *lchild;
Node *rchild;
int
c;
}Tree[110];
int
loc;
Node *creat(){
//申請結點空間
Tree[loc].lchild=Tree[loc].rchild=NULL;
return
&Tree[loc++];
}
char
str1[25],str2[25];
//儲存二叉排序樹的遍歷結果,將每一顆樹的前序遍歷得到的字串與
//中序遍歷得到的字串連線,得到遍歷結果字串
int
size1,size2;
//儲存在字元陣列中的遍歷得到字元個數
char
*str;
//當前正在儲存字串
int
*size;
//當前正在儲存字串中字元個數
void
postOrder(Node *T){
//前序遍歷
if
(T->lchild!=NULL){
postOrder(T->lchild);
}
if
(T->rchild!=NULL){
postOrder(T->rchild);
}
str[(*size)++]=T->c+
'0'
;
//將結點中的字元放入正在儲存的字串中
}
void
inOrder(Node *T){
//中序遍歷
if
(T->lchild!=NULL){
inOrder(T->lchild);
}
str[(*size)++]=T->c+
'0'
;
if
(T->rchild!=NULL){
inOrder(T->rchild);
}
}
Node *Insert(Node *T,
int
x){
//將數字插入二叉樹
if
(T==NULL){
T=creat();
T->c=x;
return
T;
}
else
if
(x<T->c)
T->lchild=Insert(T->lchild,x);
else
if
(x>T->c)
T->rchild=Insert(T->rchild,x);
return
T;
}
int
main(){
int
n;
char
tmp[12];
while
(
scanf
(
"%d"
,&n)!=EOF
&& n!=0){
loc=0;
//初始化靜態空間為未使用
Node *T=NULL;
scanf
(
"%s"
,tmp);
//輸入字串
for
(
int
i=0;tmp[i]!=0;i++){
T=Insert(T,tmp[i]-
'0'
);
//按順序將數字插入二叉排序樹
}
size1=0;
//儲存在第一個字串中的字元初始化為0
str=str1;
//將正在儲存字串設定為第一個字串
size=&size1;
//將正在儲存字串的字元個數指標指向sieze1
postOrder(T);
//前序遍歷
inOrder(T);
//中序遍歷
str1[size1]=0;
//向第一個字串的最後一個字元後新增空字元,方便使用字串函式
while
(n--!=0){
//輸入n個其他字串
scanf
(
"%s"
,tmp);
//輸入
Node *T2=NULL;
for
(
int
i=0;tmp[i]!=0;i++){
//建立二叉排序樹
T2=Insert(T2,tmp[i]-
'0'
);
}
size2=0;
//第2個字串儲存字元初始化為0
str=str2;
//將正在儲存字串設定為第2個字串
size=&size2;
//正在儲存字串中字元數量指標指向size2
postOrder(T2);
//前序遍歷
inOrder(T2);
//中序遍歷
str2[size2]=0;
//字串最後新增空字元
puts
(
strcmp
(str1,str2)==0 ?
"YES"
:
"NO"
);
//比較兩個遍歷字串,若相同則輸出YES,否則輸出NO
}
}
return
0;
}
/**************************************************************
Problem: 1009
User: alvinzxf
Language: C++
Result: Accepted
Time:0 ms
Memory:1024 kb
****************************************************************/
相關推薦
C/C++ 資料結構練習題1
題目描述: 判斷兩序列是否為同一二叉搜尋樹序列 輸入: 開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。 接下去一行是一個序列,序列長度小於10,包含(
C#入門——C#語法(資料結構)1
C#語言是一種面向物件的語言。C#程式結構大體可由註釋、名稱空間、類、Main方法和語句構成的。 一.註釋 註釋是什麼:為對某行或某段程式碼的解釋說明或忽略程式碼。 註釋的作用:方便自己閱讀與維護或讓他人能夠更好地理解自己的程式。 註釋分兩種:行註釋與塊註釋 1.行註釋 static voi
資料結構(1)順序查詢之C語言實現
#include <stdio.h> #include <stdlib.h> /** 順序查詢: 無序; */ void mainSS() { int num[]={0,1,2,38,99,56,67,87,55,26}; int f
C++自定應執行緒安全資料結構(1)
執行緒安全的棧 該執行緒安全棧的作用是,允許多個執行緒對棧進行操作,不必再棧上進行加鎖,而是棧本身內部封裝了鎖的機制。操作的本身不是並行化的,因為不可能同時對棧既新增資料,又取出資料;其真正的意義是多個執行緒訪問時,避免上述不安全的情況發生。 #include <excep
資料結構實驗1:C++實現靜態順序表類
寫了3個多小時,還是太慢了、太菜了! 圖1 程式執行演示截圖1 實驗1 1.1 實驗目的 熟練掌握線性表
C#類和結構(1)
mar 安全 類型安全 readline 參數 部分 public 方法的參數 play 1、結構功能特性? 實現代碼? 結構用struct關鍵字定義的,與類類似,但有本質區別。結構實質是一個值類型,它不需要對分配的。 結構的特性: (1)、結構作為參數傳遞時,是值傳遞。
C語言資料結構——雙迴圈連結串列的插入操作順序
雙向連結串列與單鏈表的插入操作的區別 雙向連結串列因為存在前驅指標和後繼指標所以需要修改的指標多於單鏈表,但指標改動的順序同樣重要 單鏈表的插入 eg:在節點p的後面插入指標s s->next=p->next;//首先要使要插入的指標指向p->next p->next=s
C語言資料結構-二叉樹、哈夫曼、佇列小練習
原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure 1. 二叉樹 要求: 掌握二叉樹的二叉連結串列的建立方法; 掌握二叉樹的3種遍歷遞迴演算法; 掌握二叉樹的3種遍歷的非遞迴演算法。 程式
C語言資料結構與演算法之深度、廣度優先搜尋
一、深度優先搜尋(Depth-First-Search 簡稱:DFS) 1.1 遍歷過程: (1)從圖中某個頂點v出發,訪問v。 (2)找出剛才第一個被頂點訪問的鄰接點。訪問該頂點。以這個頂點為新的頂點,重複此步驟,直到訪問過的頂點沒有未被訪問過的頂點為止。 (3)返回到
C語言資料結構——一步步教會你尾插法和頭插法
連結串列也是線性表的一種,與順序表不同的是,它在記憶體中不是連續存放的。在C語言中,連結串列是通過指標相關實現的。而單鏈表是連結串列的其中一種,關於單鏈表就是其節點中有資料域和只有一個指向下個節點的指標域。 建立單鏈表的方法有兩種,分別是頭插法和尾插法。 所謂頭插法,就是按節點的
c語言資料結構之順序表
c語言資料結構之順序表: 順序表的結構跟陣列比起來還是很像的,相比於連結串列,資料表的優勢主要體現在他的查詢速度上,而連結串列的優勢相反,查詢速度慢,但對於插入一個數據來說還是比較快的 下面我們就來建立一個順序表 1:定義資料型別,我定義的是一個學生的結構體型別,首
C語言-資料結構-鏈佇列
** 鏈式佇列 ** 使用兩種不同的方式作為初始化, 特點: 一種是傳遞 Init(&Q); 一種是直接P Q = create(); 我覺得還是這種的方式比較靈活,對比見程式 注:我的習慣是直接寫成標頭檔案,方便呼叫 這個程式使用的 是InitQue
案例3.2:括號匹配的檢驗(c++實現/資料結構/棧的基本操作)
#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status
線性表的建立————C語言資料結構學習
#include <stdio.h> #include <malloc.h> #define MaxSize 50 typedef int ElemType; typedef struct { ElemType data[MaxSize];
C語言資料結構——連結串列
轉自https://www.cnblogs.com/chenxiaohei/p/6862791.html /* 連結串列節點的插入與刪除 編譯環境:VC++ 6.0 編譯系統:windows XP SP3 */ #inc
C語言:指標練習題(1)
練習1: #include <stdio.h> #include <stdlib.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int* ptr = (int*)(&a + 1); prin
C語言資料結構的簡單實驗——二叉樹的遍歷
實驗題目: 建立一株用二叉連結串列儲存的二叉樹,並對其進行遍歷。 實驗思路: 解題關鍵是要建立二叉樹,因此對語二叉樹的每一個節點,我以連結串列為儲存方式並用遞迴的思想對其進行定義。 ** 程式碼實現: ** #include<stdio.h> #in
C語言資料結構用 棧 實現進位制轉化
直接上程式碼,思路看註釋; /*棧實現進位制轉化 *十進位制最大轉化為36進位制用10(A)-35(Z)表示 */ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #
C語言資料結構單鏈表之溫故而知新
拋棄繁雜的定義,以實用,實戰的角度來學習資料結構,這將使得資料結構的學習非常的簡單。前面已經學習了單鏈表的建立操作:http://blog.csdn.net/morixinguan/article/details/68951912這節,將單鏈表溫習的筆記共享出來,然後寫一個例
C語言資料結構——求二叉樹葉子結點個數
小編儲存了不少程式碼,最近新開通了CSDN部落格,以前一直看到別人的程式碼分享,深受啟發,非常感謝,所以小編現在也要將自己的程式碼分享給大家,希望大家可以與瀟小白一起在程式設計的道路上越走越遠,早日成為大佬!雖然我目前只是一名大二的學生,不過我會努力噠!加油!