編寫演算法實現二叉排序樹的建立,插入與刪除操作。
(建立時是根據給定資料的無序序列,按照輸入順序建立)
1.二叉排序樹的概念:
二叉排序樹是一種動態樹表。
二叉排序樹的定義:二叉排序樹或者是一棵空樹,
或者是一棵具有如下性質的二叉樹:
⑴ 若它的左子樹非空,則左子樹上所有結點的值均小於根結點的值;
⑵ 若它的右子樹非空,則右子樹上所有結點的值均大於根結點的值;
⑶ 左、右子樹本身又各是一棵二叉排序樹。二叉排序樹的性質: 按中序遍歷二叉排序樹,所得到的中序遍歷序列是乙個遞增有序序列
2.二叉排序樹的插入:
在二叉排序樹中插入新結點,要保證插入後的二叉樹仍符合二叉排序樹的定義。
插入過程:若二叉排序樹為空,則待插入結點*s作為根結點插入到空樹中;
當非空時,將待插結點關鍵字s->key和樹根關鍵字t->key進行比較,
若s->key = t->key,則無須插入,若s->key< t->key,則插入到根的左子樹中,
若s->key> t->key,則插入到根的右子樹中。而子樹中的插入過程和在樹中的插入過程相同,
如此進行下去,直到把結點*s作為乙個新的樹葉插入到二叉排序樹中,或者直到發現樹已有相同關鍵字的結點為止。
3. 二叉排序樹生成:
從空的二叉排序樹開始,經過一系列的查詢插入操作以後,生成了一棵二叉排序樹。
說明:① 每次插入的新結點都是二叉排序樹上新的葉子結點。
② 由不同順序的關鍵字序列,會得到不同二叉排序樹。
③ 對於乙個任意的關鍵字序列構造一棵二叉排序樹,其實質上對關鍵字進行排序。
4.二叉排序樹的刪除:
刪除有4種方法這裡介紹一種(如演算法),根據中序遍歷找到後件,在二叉排序樹上的體現為找到刪除節點先向右轉。然後找到右子樹上最左端節 點,將其替換。
刪除節點有多種情況:
1.沒有左節點。
2.沒有右節點。
3.左右節點都有。
#include#include#includeusing namespace std;
typedef struct node
bstnode;
int bstinsert(bstnode *&p,int k)
else if(k==p->key)//此處去重
return 0;
else if(kkey)
return bstinsert(p->l,k);
else
return bstinsert(p->r,k);
}void deletebst(bstnode *&p,int k)//使用查詢後件的方法 就是再找到刪除點之後二叉樹先向右轉一次再找到最左端節點
if(!t)
else
t->key=ss->key;
if(t!=pp)
else
pp->r=ss->r;
free(ss);
return ;
} else if(!t->l)
else if(!t->r)
if(!uu)
p=t;
else if(oo==uu->r)
uu->r=t;
else if(oo==uu->l)
uu->l=t;
free(oo);
} }void build(bstnode *&bt,int *str,int n)
}void preorder(bstnode *bt)
}void inorder(bstnode *bt)
}void posorder(bstnode *bt)
}int main()
{ int n;
int num[10120];
while(1)
{ printf("請輸入乙個整數:");
scanf("%d",&n);
printf("請輸入%d個整數(用空格隔開):",n);
for(int i=0;i
《資料結構》實驗五 樹和二叉樹實驗
1.自己設計乙個二叉樹,深度最少為4,請遞迴演算法分別用前序 中序 後序遍歷輸出樹結點。前序遍歷源 ifndef tree h define tree h struct binode class tree tree void preorder private binode root binode c...
二叉樹C 實現資料結構實驗
include include include include using namespace std templatestruct binode 二叉數節點 template 模板類 class bitree templatebitree bitree templatebitree bitree ...
sdutacm 資料結構實驗之查詢一 二叉排序樹
資料結構實驗之查詢一 二叉排序樹 timelimit 400ms memory limit 65536kb submit statistic problem description 對應給定的乙個序列可以唯一確定一棵二叉排序樹。然而,一棵給定的二叉排序樹卻可以由多種不同的序列得到。例如分別按照序列 ...