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);
        }
        
        
    };
    
    
  • 相关阅读:
    intellij idea 13
    tomcat加载web.xml
    tomcat-servlet-client
    请求由tomcat转到servlet的临界点
    传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点
    java引用被设置为null的疑惑
    javascript之数组
    javascript学习笔记
    Http响应报文
    HTTP请求报文与响应报文
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/14326715.html
Copyright © 2011-2022 走看看