[leetcode] 99. 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?

解题思路:
首先理解一下题目的意思,给定一棵BST,其中有两个元素交换了位置,要求恢复这课BST

解题思路仍然是中序遍历,我发现遇到BST的时候,大部分情况下都可以考虑一下中序遍历,由于BST中序遍历的输出是一个有序的数组,因此可以通过比较上一次节点和当前节点找到两个交换的节点,最后交换两个节点的值即可。
代码如下:

class Solution {
public:
    void inorderTravel(TreeNode* root, TreeNode* & first, TreeNode* & second, TreeNode* & prev)
    {
        if(root == NULL) return;
        inorderTravel(root->left,first,second,prev);
        if(first == NULL && prev != NULL && prev->val > root->val)//注意要保证prev不为空,否则prev->val会越界
            first = prev;
        if(first != NULL && prev != NULL && prev->val > root->val)
            second = root;
            
        prev = root;
        inorderTravel(root->right,first,second,prev);
        return;
    }
    void recoverTree(TreeNode* root) {
        TreeNode* first = NULL, *second = NULL, *prev = NULL;
        inorderTravel(root,first,second,prev);
        swap(first->val,second->val);
        return;
    }
};

参考资料:https://discuss.leetcode.com/topic/3988/no-fancy-algorithm-just-simple-and-powerful-in-order-traversal

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容