描述
驗證二元搜尋樹是否有效,有效的二元搜尋樹必須符合下列原則
- 左子樹的值小於根的值
 - 右子樹的值大於根的值
 - 左右子樹也是二元搜尋樹
 
範例
- 有效 無節點 單節點
 
    0
   / \
左右子樹
    2
   / \
  1   3
    1
     \
     (1)
右子樹節點的值小於根的值
    10
   / \
  5   15
     / \
   (6)  20
左子樹節點的值大於根的值
    3
     \
     30
    /
   10
     \
     15
       \
      (45)
原理
用中序走訪(inorder traversal)二元搜尋樹取得節點的值會升冪排列,一旦走訪節點的值小於等於前面節點的值,就不是有效二元搜尋樹
實作
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool validate(struct TreeNode* root, double *last)
{   
    if (root->left)
        if (validate(root->left, last) == false)
            return false;
    
    // Check ascending order
    if (root->val > *last)
        *last = root->val;
    else
        return false;
    
    if (root->right)
        if (validate(root->right, last) == false)
            return false;
    
    // Subtree is valid
    return true;
}
bool isValidBST(struct TreeNode* root){  
    double last = -2147483649; // integer type minimum is -2147483648, last should be able to store integer minimum
    
    if (root == NULL)
        return true;
    return validate(root, &last);
}
沒有留言:
張貼留言