算法-二叉树:验证二叉搜索树

阅读 103

2022-02-10

算法-二叉树:验证二叉搜索树

题目描述:

  1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值。
  2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值。
  3. 它的左右子树也分别是二叉搜索树。

方法一:使用中序遍历将二叉搜索树存入数组,判断数组是不是有序的即可。

void traversal(TreeNode* root,vector<int>& nums){
    if(root == NULL ) return ;
    traversal(root->left,nums);
    nums.push_back(root->val);
    traversal(root->right,nums);
}
bool isBST(TreeNode* root){
    vector<int> nums;
    traversal(root, nums);
    for(int i = 1; i < nums.size(); i++){
        if(nums[i] <= nums[i-1])
            return false;
    }
    return true;
}

方法二:使用递归,在中序遍历的时候就判断,定义一个pre指向前一个节点,root指向当前节点。

TreeNode* pre = NULL;//初始化前一个节点为NULL
bool isBST(TreeNode* root){
    if(root == NULL) return false;
    bool left = isBST(root->left); // 左
    if(!pre && pre->val>=root->val){
        return false;
    }
    pre = root;//记录前一个节点。不用处理root,因为递归时的root会被替换成root->left或right,记住这是递归!!!
    bool right = isBST(root->right);//右
    return left && right;
}

方法三:迭代法,对中序迭代法稍加改动。

bool isBST(TreeNode* root){
    if(root == NULL) return false;
    stack<TreeNode*> st;
    TreeNode* cur = root;
    TreeNode* pre = NULL;//改动
    while (!st.empty() || !cur) {
        if(!cur){//左
            st.push(cur);
            cur = cur->left;
        }
        else{
            cur = st.top();//中
            st.pop();
            
            if(pre!=NULL && pre->val >= cur->val) {//改动
                return false;
            }
            
            cur = cur->right;//右
        }
    }
    return true;
}

精彩评论(0)

0 0 举报