[LintCode]95.驗證二叉查詢樹(二叉排序樹/二叉搜尋樹) 中序遍歷
阿新 • • 發佈:2019-02-09
給定一個二叉樹,判斷它是否是合法的二叉查詢樹(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; } };