設計乙個演算法 ,判斷給定的二叉樹是否為二叉排序樹 ,假設二叉排序樹已經儲存在二叉鍊錶儲存結構中,樹節點個數為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 可以解決上述的問題 對於乙個二叉樹中的任意乙個非葉子節點,要求左子節點比當前節點小,右子節點比當前節點...