資料結構經典習題 之 二叉排序樹

2021-09-01 13:31:17 字數 1432 閱讀 2821

設計乙個演算法 ,判斷給定的二叉樹是否為二叉排序樹 ,假設二叉排序樹已經儲存在二叉鍊錶儲存結構中,樹節點個數為n,節點值為int型。

(1)給出基本設計思想

(2)根據設計思想,採用c或c++語言描述演算法,並在關鍵之處給出注釋 。

(3)分析演算法的時間複雜度和空間複雜度

這道題我第一次做的時候寫的**如下,

int judge(bnode  *bt)

if (bt==null)

return 1 ;

else {

if(bt->lchild->data<bt->data&&bt->rchild-data>bt->data){

return judge(bt->lchild)*judge(rchild);

return   0;

這段**錯誤,,加入出現這樣一種情況,也會認為是正確的。

23                57

17             89

這個時候23的左子樹小於它,他的右子樹也大於它,但是他並不是一顆二叉排序樹 ,

因為二叉樹左子樹所有的點都應該小於根,對於35來說,89屬於它的左子樹,但是89>35,不滿足二叉樹定義,所以我第一次做的**為錯誤。

要做對這道題目我們先回顧一下排序二叉樹的定義

什麼是二叉樹???

1 .空數為二叉樹

2 . 或則滿足以下三種性質

若它的左子樹不空,則左子樹上所有關鍵字的值均小於根關鍵字的字

若它的右子樹不空,則左子樹上所有關鍵字的值均小於根關鍵字的字

左右子樹又各滿足以上性質

二叉排序樹結構

typedef struct btnode{

int data;

struct btnode *child;

struct btnode  *rchild;

現在我們來解這道題目 

對二叉排序樹來說,其中序遍歷序列為遞增有序序列,因此,對給定的二叉樹進行中序遍歷,如果能保證前乙個的值不比後乙個值大,則說明該二叉樹是一顆二叉排序樹 。

int predt=inf;//假設inf為已定義的常量,它小於樹中的任何值,predt始終記錄著當前所訪問節點的前驅的值。

int judge(bnode *bt ){

int  b1,b2;

if(bt==null)//空樹是二叉排序樹

return 1 ;

else{

b1=judge(bt->lchild);

if(b1==0||predt>bt->data);//沒有出現問題不管,出現如下問題開始處理

return 0;

predt=bt->data;//將要訪問右子樹的時候,predt記錄右子樹的根節點;

bt2=judge(bt->lchild);

return b2;

資料結構之二叉排序樹

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點。以下只建立並先序列印出二叉排序樹 include include...

資料結構之二叉排序樹

二叉排序樹 bst binary sort search tree 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明 如果有相同的值,可以將該節點放在左子節點或右子節點 比如針對前面的資料 7,3,10,12,5,1,9 對應的二叉排序樹為...

資料結構之二叉排序樹

別名 二叉搜素樹,二叉查詢樹 線性結構的缺點 順序儲存 不排序 查詢困難,只能通過線性查詢乙個乙個找 排序 刪除和插入操作困難 鏈式結構 無論排序還是不排序,查詢都十分麻煩 注 二叉排序樹 bst 可以解決上述的問題 對於乙個二叉樹中的任意乙個非葉子節點,要求左子節點比當前節點小,右子節點比當前節點...