Recover Binary Search Tree [leetcode]

本题是在中序遍历的基础上,找不合规范(不是递增)的树节点对,然后交换

首先看两种序列:

1. 1 3 2 4=>应该交换3和2

2. 4 3 2 1=>应交换4和1

这两种序列对应了不符合条件的BST的中序遍历序列的所有可能性---两个节点中序遍历相邻/不相邻

如果我们用一个数组swap保存所有中序遍历不递增的结果,那么这个数组只可能是2或者4的大小

而我们交换数组中节点对内容,只需交换第一个和最后一个树节点对的内容

    vector<TreeNode *> swap;
    TreeNode * pre;
    void recoverTree(TreeNode *root) 
    {
        pre = new TreeNode(-999999);
        swap = vector<TreeNode *>();
        inorder(root);
        if (swap.size() > 1)
        {
            int val = swap[0]->val;
            swap[0]->val = swap[swap.size() - 1]->val;
            swap[swap.size() - 1]->val = val;
        }
    }
    
    void inorder(TreeNode * root)
    {
        if (root == NULL) return;
        inorder(root->left);
        if (pre->val > root->val)
        {
            swap.push_back(pre);
            swap.push_back(root);
        }
        pre = root;
        inorder(root->right);
    }
由于只交换第一个和最后一个树节点内容,我们可以只保存第一个和最后一个Node

if(!first) first = pre;

last = root;

替换

swap.push_back(pre); swap.push_back(root);

代码如下:

TreeNode * first, * last;
    TreeNode * pre;
    void recoverTree(TreeNode *root) 
    {
        pre = new TreeNode(-999999);
        first = last = NULL;
        inorder(root);
        if (first)
        {
            int val = first->val;
            first->val = last->val;
            last->val = val;
        }
    }
    
    void inorder(TreeNode * root)
    {
        if (root == NULL) return;
        inorder(root->left);
        if (pre->val > root->val)
        {
            if (!first) first = pre;
            last = root;
        }
        pre = root;
        inorder(root->right);
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值