1. 程式人生 > >[LintCode]95.驗證二叉查詢樹(二叉排序樹/二叉搜尋樹) 中序遍歷

[LintCode]95.驗證二叉查詢樹(二叉排序樹/二叉搜尋樹) 中序遍歷

給定一個二叉樹,判斷它是否是合法的二叉查詢樹(BST)

一棵BST定義為:

  • 節點的左子樹中的值要嚴格小於該節點的值。
  • 節點的右子樹中的值要嚴格大於該節點的值。
  • 左右子樹也必須是二叉查詢樹。
  • 一個節點的樹也是二叉查詢樹。
樣例

一個例子:

  2
 / \
1   4
   / \
  3   5

上述這棵二叉樹序列化為 {2,1,4,#,#,3,5}.

思路:觀察二叉查詢樹,可以發現二叉查詢樹的一個特點,那就是二叉查詢樹中序遍歷可以得到一個遞增的序列,只需中序遍歷二叉樹,判斷其序列是否遞增即可。中序遍歷的結果就是排序二叉樹的輸出,可以用中序遍歷判定二叉樹是否為二叉查詢樹。

紅黑樹、平衡搜尋二叉樹(AVL樹)等,其實都是搜尋二叉樹的不同實現。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /*
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    bool isValidBST(TreeNode * root) {
        int lastvalue=0;
        //vector<int> tmp;
        //if(root==NULL) return tmp;
        stack<TreeNode*> s;
        TreeNode* cur=root;
        while(!s.empty()||cur!=NULL){
            if(cur!=NULL){  //遍歷左子樹
                s.push(cur); //把遍歷的結點全部壓棧
                cur=cur->left;
            }else{
                cur=s.top();
                //tmp.push_back(cur->val);
                s.pop();
                if(lastvalue==0||lastvalue<cur->val){
                //如果是第一次彈出或lastvalue小於當前結點值
                   lastvalue = cur->val;
                }else if(lastvalue >= cur->val){
                    return false;//如果lastvalue大於當前結點值,返回false
                }
                cur=cur->right;//指向右子節點,下次迴圈時會中序遍歷右子樹
            }
        }
        return true;
    }
};