資料結構實驗4 特殊二叉樹的應用

2021-09-22 21:10:39 字數 3784 閱讀 6840

背景

靜態查詢表(static search table):只作查詢操作的查詢表。

動態查詢表(dynamic search table):在查詢過程同時插入查詢表中不存在的資料元素,或者從查詢表中刪除已經存在的某個資料元素。

實驗目的

基於課程「bst」,實現二叉查詢樹(bst),實現乙個靜態查詢表。

基本要求

1.使用二叉查詢樹(bst)來實現。

2. 二叉樹使用鏈式結構(二叉鍊錶)實現。

3. 基於bst,實現靜態查詢表。

4. 在查詢表中查詢時,要輸出關鍵字比較的次數。

給定乙個含有n個整數的集合,有一查詢系統:使用者可隨意給出乙個整數m,便可 通過該系統知道m是否在這個集合中,且可以知曉查詢該整數m需要多少步。請你實 現該功能。

實現的功能:

1.通過鍵盤輸入整數的個數n以及n個整數還有查詢的元素值m;

2.查詢m是否在這n個整數中;

3.求出查詢該整數m需要的步數;

4.通過螢幕顯示是否查詢成功以及比較的次數。

第一行輸入整數個數n,且0每當輸入乙個待查元素,就輸出查詢成功或不成功,並且後面有乙個數字表示查詢的次數,例如:

輸入:21 //查詢21,

輸出:查詢成功 1//表示查詢時比較的次數。

樣例 1: 整數以公升序排列(構建的樹為斜樹)

輸入: 請輸入資料個數: 4

請輸入資料: 2 3 7 8

請輸入欲查詢的數:3

請輸入欲查詢的數:100

輸出: 查詢成功 2

查詢失敗 4

樣例 2:集合中比第乙個數小的數的個數大於比第乙個數大的數的個數

輸入: 請輸入資料個數:5

請輸入資料:8 4 10 6 3

請輸入欲查詢的數:4

請輸入欲查詢的數:10

請輸入欲查詢的數:2

輸出 查詢成功 2

查詢成功 2

查詢失敗 3

樣例 3:按照bst特性可構建出完全二叉樹

輸入: 請輸入資料個數:5

請輸入資料:20 9 30 7 25

請輸入欲查詢的數:25

輸出: 查詢成功 3

樣例 4: 只有乙個整數

輸入: 請輸入資料個數:1

請輸入資料:2

請輸入欲查詢的數:0

請輸入欲查詢的數:2

輸出: 查詢成功 1

查詢失敗 1

樣例 5:第乙個數為這組數中最小的數

輸入: 請輸入資料個數:7

請輸入資料:1 6 7 78 41 54 4

請輸入欲查詢的數:41

請輸入欲查詢的數:85

輸出: 查詢成功 5

查詢失敗 4

資料物件:一組互不相等且可比較大小的整數

資料關係:空樹或者有bst特性的二叉樹

基本操作:

1.準備能儲存這組資料的空間

2.插入元素

3.訪問左子樹

4.訪問右子樹

5.查詢元素

bst的adt的設計:

adt  bsttree

資料關係:r

若d = φ,則r=φ;

若d≠φ,則r=,h是如下二元關係:

在d中存在唯一的稱為根的資料元素root,它在關係h下無前驅;

若d-≠φ,則存在d-=,且dl∩dr=φ,xl∈h,且存在dl上的關係hl∈h; 若dr≠φ,則dr中存在惟一的元素xr,∈h,且存在dr上的關係hr∈h;h=;

(d1,)是一棵符合本定義的二叉樹,稱為根的左子樹; (dr,)是一棵符合本定義的二叉樹,稱為根的右子樹。

基本操作:

bstnode* getroot();//操作功能:獲得根節點,結果返回根節點

void inserthelp(bstnode*, int &e );

//操作功能:插入值為e的結點

void insert(e& e);//呼叫inserthelp函式,實現資料封裝

bool findhelp(bstnode* ,int e,int &count=0);

//操作功能:查詢值為e的結點

//若e存在,則返回查詢成功,否則返回查詢失敗,count為比較的次數。

bool find( int e);

//呼叫findhelp函式,實現資料封裝

class bstnode;

2. bst tree adt

int count=0;//記錄關鍵字的比較次數

class bst:public bstnode

bstnode* inserthelp(bstnode*root, int &val );

void insert(int e)//插入值為e的元素

bool find(int e)

輸入格式:第一行輸入整數個數n;

第二行包含n個整數a1, a2, …, an,用空格分隔;

接下來的每一行都有乙個整數b;

輸出格式:若該元素在樹中,則輸出查詢成功,並輸出比較次數;否則輸出查詢不成功與 比較次數。

建樹模組:

void creat(bsttree& tree,int n)

for(i=0;i輸出模組:

void print(bsttree t,int e)

bstnode(int e,bstnode *l=null, bstnode *r=null)//含參建構函式

int getdate()

bstnode* left()

bstnode* right()

void setleft(bstnode *l)

void setright(bstnode *r)

};#endif

bsttree.h

#include "bstnode.h"

#ifndef _bsttree_h

#define _bsttree_h

#include class bsttree

if (e < t->getdate())

else if (e > t->getdate())

return t;

} bool find(bstnode *root, int e, int &count)

return false;

} void clear(bstnode* t)

public:

bsttree()

bstnode* getroot()

void clear()

void insert(int e)

bool find(int e,int &count)

};#endif

main.cpp

#include "bstnode.h"

#include "bsttree.h"

#include using namespace std;

int main()

int f;

cout << "請輸入要查詢的值:" ;

while (cin >> f)

else

cout << "請輸入要查詢的值:" ;

} t.clear();

return 0;

}

資料結構實驗之二叉樹四 還原二叉樹

time limit 1000ms memory limit 65536k 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入資料有多組,每組資料第一行輸入1個正整數n 1 n 50 為樹中結點總數,隨後2行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區分大小...

資料結構實驗之二叉樹四 還原二叉樹

time limit 1000ms memory limit 65536k 有疑問?點這裡 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入資料有多組,每組資料第一行輸入 1個正整數 n 1 n 50 為樹中結點總數,隨後 2行先後給出先序和中序遍歷序列,均是長度為 n的不包...

資料結構實驗之二叉樹四 還原二叉樹

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入資料有多組,每組資料第一行輸入 1個正整數 n 1 n 50 為樹中結點總數,隨後 2行先後給出先序和中序遍歷序列,均是長度為 n的不包含重複英文本母 區分大小寫 的字串。輸出乙個整數,即該二叉樹的高度。9 abdfghiec ...