題目:判斷一棵樹是否爲BST樹
因爲BST廣爲人知,所以就不搬原文了,其中節點的數值是int類型。
對於BST樹,對它做中序遍歷即可輸出排好序的一串數字,那麼對於這個題目就有兩個思路:
1. 對這棵樹做一次中序遍歷,輸出一個數組,然後判斷數組是否有序
2. 同樣是做中序遍歷,但只比較當前節點的數值與前一個節點的數值大小
對於第一種思路,很好實現,先做一次中序遍歷,中序遍歷有遞歸與非遞歸的實現,遞歸實現比較直觀,所以在這裏只說說非遞歸的實現。
使用棧來保存接下來要訪問的節點,先訪問完左子樹,即root->left == NULL
了,就取棧頂保存的該節點的父親,然後訪問其值,再訪問右子樹root = root->right
。
對於第二種思路,需要保存上一個訪問的節點的值,判斷當前節點的值與上一個節點的值是否符合BST規則。在中序遍歷的訪問節點階段做個判斷即可。
以下是第二種思路的代碼:
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
signed long long int prv = LLONG_MIN;
TreeNode* _root = root;
stack<TreeNode*> sequence;
while (_root != NULL || !sequence.empty()) {
if (_root != NULL) {
sequence.push(_root);
_root = _root->left;
}
else {
_root = sequence.top();
//訪問
if (_root->val <= prv) {
return false;
}
sequence.pop();
prv = _root->val;
_root = _root->right;
}
}
return true;
}
代碼使用了一個LLONG_MIN
的值初始化prv
,但這不是好的邊界處理,因爲題目稍作修改這個初始化的值又要換一個更小的值。解決這個問題可以在遍歷訪問到最左的節點時(即最小的節點)使用那個值初始化prv