leetcode算法练习——恢复二叉树

题目:

二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。

示例:

输入: [1, 3, null, null, 2]

1
/
3
\
2

输出: [3, 1, null, null, 2]

3
/
1
\
2

代码如下:

class Solution {
public:
    void recoverTree(TreeNode* root)
    {
        vector<int> midorder;
        stack<TreeNode*> node;
        TreeNode* p = root;
        while (p || node.size())
        {
            while (p)
            {
                node.push(p);
                p = p->left;
            }
            p = node.top();
            node.pop();
            midorder.push_back(p->val);
            p = p->right;
        }
        vector<int> order(midorder);
        sort(order.begin(), order.end());
        int x(0);
        int y(0);
        for (int i = 0; i < order.size(); i++)
        {
            if (order[i] < midorder[i]) x = order[i];
            else if (order[i] > midorder[i]) y = order[i];
        }
        recover(root, 2, x, y);
    }
    void recover(TreeNode* root, int count, int x, int y)
    {
        if (root->val == x)
        {
            root->val = y;
            count -= 1;
        }
        else if (root->val == y)
        {
            root->val = x;
            count -= 1;
        }
        if (count == 0) return;
        if (root->left) recover(root->left, count, x, y);
        if (root->right) recover(root->right, count, x, y);
    }
};

运行结果:

在这里插入图片描述

发布了102 篇原创文章 · 获赞 6 · 访问量 2026

猜你喜欢

转载自blog.csdn.net/qq_44957388/article/details/105084960