Recover Binary Search Tree

来源:互联网 发布:linux服务器搭建 编辑:程序博客网 时间:2024/05/18 04:00

题目:

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?

1. 最直观的方法是用一个向量中序遍历存储整棵树,然后查找不符合增序的数(如果只找到一个,则说明交换的两个数相邻),不过这需要O(n)的空间。

2. 另一个方法也是使用递归中序遍历树,使用pre记录当前节点的前一个节点,进行比较,这种方法不需要额外的向量开销,但是如果把递归的空间算上,则平均需要O(lgn)空间,最差需要O(n)空间。

代码如下:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void recoverTree(TreeNode *root) {        TreeNode *pre = NULL, *mis1 = NULL, *mis2 = NULL;        findMistakes(root, mis1, mis2, pre);        if(mis1 != NULL && mis2 != NULL) {            int tmp = mis1->val;            mis1->val = mis2->val;            mis2->val = tmp;        }            }private:    void findMistakes(TreeNode *root, TreeNode *&mis1, TreeNode *&mis2, TreeNode *&pre) {        if(root == NULL)            return;        findMistakes(root->left, mis1, mis2, pre);        if(pre != NULL && pre->val > root->val) {            if(mis1 == NULL) {                mis1 = pre;                mis2 = root;            }            else {                mis2 = root;            }        }        pre = root;        findMistakes(root->right, mis1, mis2, pre);    }};

第三种方法分析请参考:http://www.cnblogs.com/graph/archive/2013/08/11/3252079.html

0 0