题目:判断一棵树是否为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