iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Software Development

用C++ 設計程式中的系統櫃系列 第 29

[Day 29] 用C++ 設計程式中的系統櫃:BST::isValid()

  • 分享至 

  • xImage
  •  

學了二元搜尋樹的基本,那想過怎麼判斷這棵樹是不是二元搜尋樹嗎?


還記得有一個遍歷演算法叫做「中序遍歷」或 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;
}


是不是很簡單啊!
善用我們已知的二元搜尋樹特性,就可以解決不少問題喔。

那有沒有其他方法呢?當然有,就是利用二元搜尋樹的特性(左子樹 < 根節點 < 右子樹)再搭配遞迴函式,同樣可以求出結果。


上一篇
[Day 28] 用C++ 設計程式中的系統櫃:BST::lowestCommonAncestor()
下一篇
[Day 30] 用C++ 設計程式中的系統櫃:總結
系列文
用C++ 設計程式中的系統櫃30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言