LeetCode Algorithms 98. Validate Binary Search Tree 题解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章