leetcode第一刷_Recover Binary Search Tree

这是一道好题,思路虽然有,但是提交之后总是有数据过不了,又按照数据改改改,最后代码都没法看了。收到的教训是如果必须为自己的代码加上很多很多特殊的限定,来过一些特殊的数据的话,说明代码本身有很大的漏洞。

这道题,我想到了要用两个指针保存乱序的节点,甚至想到了用一个pre指针来保存前面一个节点,但是问题出在哪里呢?我觉得应该是自己对树的遍历理解的不够深刻。既然知道了二叉搜索树一定是用中序遍历的,那么程序的框架应该马上写的出来,先左子树,再根,再右子树,那你说什么时候更新pre指针呢,当然是访问根节点的时候,如果把每次返回的节点作为接下来考虑的左子树,其实并不是一种中序遍历,更像是前序遍历。还有一点,我当时总是想单独的找出这两个乱序的节点,然后加了很多特殊情况考虑如果他们两个相邻怎么办。其实这不是很好解决的吗,因为一共只有两个节点乱掉了,那么一开始不满足条件的那对节点肯定包含了其中一个,而且是较大的那个是乱掉的。往后的话,如果又出现了这个问题,一定是较小那个,不用加任何特殊情况的考虑。

代码非常简洁,好惭愧:

TreeNode *e1, *e2, *pre;
void inorder(TreeNode *root){
   if(root == NULL) return;
   if(root->left)
       inorder(root->left);
   if(pre&&pre->val>root->val){
       if(e1 == NULL)   e1 = pre, e2 = root;
       else e2 = root;
   }
   pre = root;
   if(root->right)
        inorder(root->right);
    return;
} 

class Solution {
public:
    void recoverTree(TreeNode *root) {
        pre = NULL, e1 = NULL, e2 = NULL;
        inorder(root);
        swap(e1->val, e2->val);
        return;
    }
};

leetcode第一刷_Recover Binary Search Tree

时间: 2024-10-29 19:09:44

leetcode第一刷_Recover Binary Search Tree的相关文章

leetcode第一刷_Validate Binary Search Tree

有了上面的教训,这道题就简单多了,什么时候该更新pre是明白的了,倒是有个细节,二叉搜索树中是不同意有相等节点的,所以题目的要求用黑体字标明了.写的时候注意就能够了. class Solution { public: TreeNode *pre = NULL; bool isValidBST(TreeNode *root) { if(root == NULL) return true; bool res = true; if(root->left) res &= isValidBST(roo

leetcode第一刷_Unique Binary Search Trees

这道题其实跟二叉搜索树没有什么关系,给定n个节点,让你求有多少棵二叉树也是完全一样的做法.思想是什么呢,给定一个节点数x,求f(x),f(x)跟什么有关系呢,当然是跟他的左右子树都有关系,所以可以利用其左右子树的结论,大问题被成功转化成了小问题.最熟悉的方法是递归和dp,这里显然有大量的重复计算,用dp打表好一些. 后来实验的同学说,这其实是一个Catalan数,上网查了一下,果然啊.Catalan数是这样子的: h(0) = 1, h(1) = 1; 递推式:h(n)= h(0)*h(n-1)

leetcode第一刷_Unique Binary Search Trees II

http://acm.hdu.edu.cn/showproblem.php?pid=1507 大致题意:在一个n*m的格子上,黑色的地方不可用,问在白色格子上最多可放多少1*2的矩阵. 思路:建图,每个白色格子与它临近的上下左右的白色格子建边,求最大匹配,答案为最大匹配/2,因为是双向图.最后输出匹配边时,当找到一组匹配边记得将该边标记,以防重复计算. #include <stdio.h> #include <algorithm> #include <set> #inc

leetcode第一刷_Balanced Binary Tree

二叉平衡树好火啊,几乎每个公司的笔试题里都有它,考了好多次我都不会,挂笔试很有可能就是因为它,还有一个它的同伙叫二叉搜索树,貌似人气比它还要高一些.二叉平衡树是什么样的树呢,是每个节点的左右子树高度相差绝对值都不超过1.好,你说你终于回了,这不很简单吗,求一下根节点的左右字数高度,如果满足,他就是,否则就不是嘛.不是啊亲,要求是所有节点都满足这个条件,判断的时候必须每个节点都验证的! 扯了这么长,其实看看代码就明白了,怎么有种在贴吧发言要凑够15字的感觉. int getHeight(TreeN

leetcode第一刷_Construct Binary Tree from Inorder and Postorder Traversal

这道题是为数不多的感觉在读本科的时候见过的问题.人工构造的过程是怎样呢,后续遍历最后一个节点一定是整棵树的根节点,从中序遍历中查找到这个元素,就可以把树分为两颗子树,这个元素左侧的递归构造左子树,右侧的递归构造右子树,元素本身分配空间,作为根节点. 于set和map容器不同的是,vector容器不含find的成员函数,应该用stl的库函数,好在返回的也是迭代器,而vector的迭代器之间是可以做减法的,偏移量很方便的得到. TreeNode *buildRec(vector<int> &

LeetCode详细分析 :: Recover Binary Search Tree [Tree]

Recover the tree without changing its structure. Note: A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ. 这里

【一天一道LeetCode】#98. Validate Binary Search Tree

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes

【LeetCode】98. Validate Binary Search Tree

Difficulty:Medium  More:[目录]LeetCode Java实现 Description https://leetcode.com/problems/validate-binary-search-tree/ Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a nod

[LeetCode] Find Mode in Binary Search Tree 找二分搜索数的众数

Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST. Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than or equal to the nod