zoukankan      html  css  js  c++  java
  • 中序遍历 恢复BST 树

    恢复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);
        }
        
        
    };
    
    
  • 相关阅读:
    P2731 骑马修栅栏 Riding the Fences
    P1351 联合权值
    [脚本]为所有节点挂载磁盘
    [转]expect的安装
    挂载磁盘linux
    [转]Mac 科研常用软件
    [转]error while loading shared libraries 错误解决办法总结
    linux安装SVN
    Java web项目在linux环境下自动编译和部署脚本
    个人所得税计算方法
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/14326715.html
Copyright © 2011-2022 走看看