Recover Binary Search Tree

来源:互联网 发布:电子元器件查询软件app 编辑:程序博客网 时间:2024/06/06 14:05

https://oj.leetcode.com/problems/recover-binary-search-tree/


Two elements of a binary search tree (BST) are swapped by mistake.

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?


这一题考虑的做法第一优先就是inorder遍历看是否顺序,把乱序的两个元素交换就可以了。需要注意的是乱序的判断。

譬如 1, 2 ,3 ,4 变成了 3 ,2 ,1 ,4。这个就很容易判断了,3大于后面哪一个,1小于前面的那一个,明显是3 和1 换了

但如果变成了 2, 1, 3, 4的话。我们可以知道2肯定是不对的,但1是不是不对,就不好说了,因为1在一个错误的元素之后,所以它也必须成为一个candidate,所以再出现第二个candidate之前它就是错的那个。

那么给出代码吧。

    TreeNode first = null, second = null, prev = null;    public void recoverTree(TreeNode root) {        inorderTraversal(root);        int tmp = first.val;        first.val = second.val;        second.val = tmp;    }        public void inorderTraversal(TreeNode root){        if(root == null)            return;        inorderTraversal(root.left);        if(prev != null){            if(root.val < prev.val){                second =  root;                first = first == null ? prev : first;            }        }        prev = root;        inorderTraversal(root.right);    }

本身这个勉强算是一个constant space的解法,但call stack其实空间是logN的。为了严格遵守空间constant space的额外要求。这里我只能提示一个比较有名的线段二叉树的算法Morris Traversal,这是目前可以找得到的On time O1 space的真正算法。具体我就不给代码了,以后有时间我再补上吧。

给个链接大家有兴趣可以自己研究,大概理念就是通过不断的更改树的结构达到可以回到根节点最后再更改回来原来树的形态的一个算法:

http://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html

0 0
原创粉丝点击