Geek

博客园 首页 新随笔 联系 订阅 管理

恢复BST

题目描述
二叉搜索树(BST)中的两个节点被错误地交换了,
请在不改变树的结构的情况下恢复这棵树。
备注;
用O(n)的空间解决这个问题的方法太暴力了,你能设计一个常数级空间复杂度的算法么?
示例 1:

输入: [1,3,null,null,2]

1
/
3

2

输出: [3,1,null,null,2]

3
/
1

2
说明:本题目包含复杂数据结构TreeNode,点此查看相关信息


typedef TreeNode Node;
class Solution {
public:
    void recoverTree(TreeNode *root) {
        pre=a=b=NULL;
        dfs(root);
        
        if(a&& b  && a->val > b->val) swap(a->val,b->val);
        
    }
    Node* pre=NULL,* a=NULL,* b=NULL;
    
    void dfs(Node* root) {
        if(root==NULL) return;
        dfs(root->left);
        if(pre) {
            if(pre->val > root->val) {
                if(!a) a = pre;
                b = root;
            }
        }
        pre = root;
        dfs(root->right);
        
        
    }
    
    
};

判断二叉树

判断给出的二叉树是否是一个二叉搜索树(BST)
二叉搜索树的定义如下
一个节点的左子树上节点的值都小于自身的节点值
一个节点的右子树上节点的值都大于自身的节点值
所有节点的左右子树都必须是二叉搜索树
如果你不清楚“{1,#,2,3}"的含义的话,请继续阅读
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。

判断二叉树


typedef TreeNode Node;
class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isValidBST(TreeNode* root) {
        bool isBST=true;
        Node* pre =NULL;
        return dfs(pre,isBST,root),isBST;
        
    }
    
    void dfs(Node* & pre,bool &isBST,Node* root) {
        if(root==NULL) return;
        dfs(pre,isBST,root->left);
        if(pre) {
            if(pre->val >= root->val) 
            {
                isBST = false;
                return;
            }
           
        }
        
        pre = root;
        dfs(pre,isBST,root->right);
    }
    
    
};

posted on 2021-01-25 18:15  .geek  阅读(285)  评论(0编辑  收藏  举报