二叉排序樹是一顆特殊的二叉樹,它是一顆二叉樹但同時滿足如下條件:對於樹上的任意乙個結點,其上的數值必大於等於其左子樹上任意結點數值,必小於等於其右子樹上任意結點的數值。
由於各個數字插入的順序不同,所得到的二叉排序樹的形態也很可能不同,所以不同的插入順序對二叉排序樹的形態有重要的影響,但其都有乙個共同點:若對二叉排序樹進行中序遍歷,那麼其遍歷結果必然是乙個遞增序列,所以通過建立二叉排序樹就能對原無需序列進行排序,並實現動態維護。
題目描述:輸入一系列整數,建立二叉排序數,並進行前序,中序,後序遍歷。
輸入:輸入第一行包括乙個整數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#includeusing
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#includeusing
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#includeusing
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 不能採用...