這道題剛開始自己想沒有很好的思路來判斷輸入的序列是否構成同一棵二叉搜尋樹。關於要構造幾顆樹,輸入乙個序列構造乙個然後再將兩顆樹比較,還是只要構造一顆,還是不用構造?比較好的解決辦法是由第乙個序列構造一顆,之後輸入的序列裡的數再與這顆搜尋樹比較,來判斷。
那麼怎樣判斷呢?可以發現如果乙個數插入時經過了之前沒有出現過的點,則這兩棵樹應該是不一樣的。
建立樹時注意要先生成根節點,然後後面的for迴圈要從i=1起,不然會出現段錯誤。
debug的能力得到提高:通過列印+二分法。
**在程式中段插乙個列印語句,把程式執行到那裡的變數值列印出來看看。
如果正確,說明後半段錯了;如果錯誤,說明前半段錯了。
根據錯誤提示,根據程式的思路逐步執行,一步步排查錯誤出現的位置,在特定的地方進行列印輸出。debug需要的是細心與耐心。**
**:
/*判斷是否是同一棵二叉搜尋樹:對於各種輸入不同的序列,判斷它們是否構成一樣的二叉搜尋樹*/
#include
#include
#include
using namespace std;
//二叉樹的表示
typedef int datatype;
typedef struct treenode *tree;
typedef struct treenode treenode;
//二叉樹的建立
tree newnode(int v)
tree insert(tree t, int v)
returnt;}
tree builttree(int n)
// printf("built tree !\n");
returnt;}
/*void preoderprinttree(tree t)
if (!s.empty())
}}*/
/*void preorderprinttree(tree t) */
//判斷輸入系列與二叉樹是否相等
//檢查每次搜尋中是否出現前面未出現的點
int check(tree t, int v) else
if (v < t->v)
return check(t->left, v);
else
return
0; }
//如果當前點之前沒有出現過,且與序列中的當前點相等,則將flag標誌置為1,表示經過該點
else else
return
0; }
}int judge(tree t, int n) else
for (i = 1; i < n;
i++) //如果頭節點一致而後面有沒有出現過的點出現
} if (flag)
return
0; else
return1;}
void resettree(tree t)
void freetree(tree t)
int main()
freetree(t);
scanf("%d", &n);
} return
0;}
《大話資料結構》學習筆記四
串 string 是由零個或多個字元組成的有限序列,又名叫字串。串 string 是由零個或多個字元組成的有限序列,又名叫字串。給定兩個串 s a1a2 an t b1b2 bm 當滿足以下條件之一時,sni bi i 1,2,n 存在某個ki bi i 1,2,k 1 ak kadt 串 stri...
資料結構學習筆記
資料結構概述 定義我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構 儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢摸個 元素,刪除某個元素,對所有元素進行排序 而執行的相應操作,這個相應 的操作也叫演算法 資料結構 個體 個體的關係 演算法 對儲存資料的操作 演算...
資料結構學習筆記
資料結構學習筆記 程式 資料結構 演算法 資料結構 資料 結構 結構的本質是關係 資料之間的關係從不通風層面上分為邏輯關係和物理關係 演算法的設計要依據資料的邏輯關係 演算法的實現要依據資料的物理關係 物理關係是邏輯關係的基礎和載體 演算法實現時需要先依據問題抽象出資料模型,即初步確定待處理資料的邏...