LeetCode -- Recover Binary Search Tree 详细解答

题目内容:一个二叉搜索树中的两个节点被错误交换了,找出这两个节点。


空间复杂度为o(n)的解法很简单:中序输出该二叉树,然后查找输出序列中两个失序的元素即可。题目还要求有空复为o(1)的解法,代码如下:


/**
 * 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 findpos(TreeNode *root, TreeNode * &pre, TreeNode * &p, TreeNode * &q) {
        if (!root) return;
        findpos(root->left, pre, p, q);
        if (pre && pre->val > root->val) {
            if (!p) p = pre;
            q = root;
        }
        pre = root;
        findpos(root->right, pre, p, q);
    }
    void recoverTree(TreeNode *root) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        TreeNode *p, *q, *pre;
        pre = p = q = NULL;
        findpos(root, pre, p, q);
        int tmp = p->val;
        p->val = q->val;
        q->val = tmp;
    }
};

解法思路为:

概括的说,findpos函数使用中序递归遍历整个BST,在遍历所有节点的左子树时,pre是root的左子节点,当pre大于root时即找到错误节点(标记为p);遍历任意节点的右子树时,root为pre的右子节点(注意顺序),当pre大于root时即找到第二个错误节点(标记为q)。

具体而言:
从根节点开始查找,重复执行第14行直至找到第一个左叶子节点,并设置pre为该左叶子节点后返回至上一层递归;
之后执行第15行,此时pre是root的左节点:
1) 当pre大于root时,pre即为错误节点,标记为p。查找到第一个错误节点后,pre变为root的父节点,root是pre的右节点,当pre大于root时,root就是是错误节点,标记为q,算法结束。
2) 若pre小于root时,改变pre并执行第20行,进入下一层递归;此时pre变为root的父节点,root是pre的右节点,若pre大于root,则pre就是错误节点,标记pre为p,之后逻辑和 1) 中类似,标记出q,算法结束



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值