資料結構 二叉排序樹

2022-06-13 21:36:09 字數 3369 閱讀 3297

二叉排序樹是一顆特殊的二叉樹,它是一顆二叉樹但同時滿足如下條件:對於樹上的任意乙個結點,其上的數值必大於等於其左子樹上任意結點數值,必小於等於其右子樹上任意結點的數值。

由於各個數字插入的順序不同,所得到的二叉排序樹的形態也很可能不同,所以不同的插入順序對二叉排序樹的形態有重要的影響,但其都有乙個共同點:若對二叉排序樹進行中序遍歷,那麼其遍歷結果必然是乙個遞增序列,所以通過建立二叉排序樹就能對原無需序列進行排序,並實現動態維護。

題目描述:輸入一系列整數,建立二叉排序數,並進行前序,中序,後序遍歷。

輸入:輸入第一行包括乙個整數n(1<=n<=100)。 接下來的一行包括n個整數。

輸出:可能有多組測試資料,對於每組資料,將題目所給資料建立乙個二叉排序樹,並對二叉排序樹進行前序、中序和後序遍歷。每種遍歷結果輸出一行。每行最後乙個資料之後有乙個空格。

樣例輸入:

51 6 5 9 8

樣例輸出:

1 6 5 9 8

1 5 6 8 9

5 8 9 6 1

#include#include

using

namespace

std;

struct

nodetree[

110];

intloc;

node *create()

void preorder(node *t)

void postorder(node *t)

void inorder(node *t)

node *insert(node *t,int

y)

else

if(y>t->x)

t->rchild=insert(t->rchild,y);

else

t->lchild=insert(t->lchild,y);

returnt;}

intmain()

preorder(t);

printf("\n

");inorder(t);

printf("\n

");postorder(t);

printf("\n

");}

return0;

}

題目描述:判斷兩序列是否為同一二叉搜尋樹序列

輸入:開始乙個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。

接下去一行是乙個序列,序列長度小於10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。

接下去的n行有n個序列,每個序列格式跟第乙個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。

輸出:如果序列相同則輸出yes,否則輸出no

樣例輸入:

2567432

543267

576342

0樣例輸出:

yesno

解法一是作者寫的比較直觀的解法,通過四個char型陣列來儲存第一次和後面遍歷的二叉樹的中序排列和前序排列,通過strcmp來比較字串即可判斷兩序列是否為同一二叉搜尋樹。

#include#include

using

namespace

std;

struct

nodetree[

12];

intloc;

node *create()

char s1[12];//

第乙個字串中序

char s2[12];//

第乙個字串前序

char s3[12];//

比較字串中序

char s4[12];//

比較字串前序

intindex;

void inorder(node *t,char *s)

void preorder(node *t,char *s)

node *insert(node *t,char

y)

else

if(y>t->x)

else

t->lchild=insert(t->lchild,y);

returnt;}

intmain()

index=0

; inorder(t,s1);

index=0

; preorder(t,s2);

for(int i=0;i)

}return0;

}

解法二為書本例項**如下:

#include#include

using

namespace

std;

struct

nodetree[

110];

intloc;

node *create()

char str1[25],str2[25];//

儲存二叉查詢樹的遍歷結果,前序和中序連線得到字串

int size1,size2;//

儲存在字元陣列中的遍歷得到字元個數

char *str;//

當前正在儲存字串

int *size;//

當前正在儲存字串中字元個數

void postorder(node *t)

void inorder(node *t)

node *insert(node *t,int

x)

else

if(xc)

t->lchild=insert(t->lchild,x);

else

if(x>t->c)

t->rchild=insert(t->rchild,x);

return

t;}

intmain()

size1=0

; str=str1;//

將正在儲存字串設定為第乙個字串

size=&size1;//

將正在儲存字串中的字元個數指標指向size1

postorder(t);

inorder(t);

str1[size1]=0

;

while(n--)

size2=0

; str=str2;

size=&size2;

postorder(t2);

inorder(t2);

str[size2]=0

; puts(strcmp(str1,str2)==0?"

yes":"no"

); }

}return0;

}

資料結構 二叉排序樹

二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為 樹表。可以作為一種排序和檢索的手段。定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹 其左子樹上所有結點的資料值均小於根結點的資料值 右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。對二叉...

資料結構 二叉排序樹

二叉排序樹 binarysorttree 具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 include includeusing namespace std type...

資料結構 二叉排序樹

如果需要乙個滿足 支援排序性 高效插入 刪除操作 高效查詢的資料結構,怎麼做?先看看一些簡單的資料結構 1 排序順序表 陣列 查詢可以採用折半查詢演算法,時間效率為o log2n 插入 刪除操作的時間複雜度為o n 資料量大時,效率太低。2 排序單鏈表 只能採用順序查詢,時間複雜度為o n 不能採用...