學了二元搜尋樹的基本,那想過怎麼判斷這棵樹是不是二元搜尋樹嗎?
還記得有一個遍歷演算法叫做「中序遍歷」或 inorder traversal
嗎?
用這個遍歷法的出來的資料有什麼特色呢?
這些資料是由大到小被輸出的!!將資料儲存到一個陣列中做儲存,再來判斷是否為遞增排序的。
void inorderTraversal(std::vector<int> *temp, BSTNode *root) {
if (root == NULL) return ;
if (root -> left) inorderTraversal(temp, root -> left);
temp -> push_back(root -> data);
if (root -> right) inorderTraversal(temp, root -> right);
}
bool BST::isValid() {
std::vector<int> temp;
inorderTraversal(&temp, this -> root);
int prev = INT_MIN;
for (int i: temp) {
if (i <= prev) return false;
prev = i;
}
return true;
}
是不是很簡單啊!
善用我們已知的二元搜尋樹特性,就可以解決不少問題喔。
那有沒有其他方法呢?當然有,就是利用二元搜尋樹的特性(左子樹 < 根節點 < 右子樹)再搭配遞迴函式,同樣可以求出結果。