恢复二叉搜索树

对二叉搜索树进行中序遍历,用数组保存结点,用另一个数组保存结点的值,然后找到值错误的两个结点,然后直接交换值就行

 class Solution {
public:
    void recoverTree(TreeNode* root) {
        vector<int> vals;
        vector<TreeNode*> nodes;
        stack<TreeNode*> stk;
        TreeNode* curr = root;
        // 非递归中序遍历
        while (curr != nullptr || !stk.empty()) {
            while (curr != nullptr) {
                stk.push(curr);
                curr = curr->left;
            }
            curr = stk.top();
            stk.pop();
            vals.push_back(curr->val);
            nodes.push_back(curr); 
            curr = curr->right;
        }
       // 找第一个逆序位置i
        int i = 0, j = vals.size() - 1;
        while (i < vals.size() - 1 && vals[i] < vals[i+1]) i++;
        // 找最后一个逆序位置j
        while (j > 0 && vals[j] > vals[j-1]) j--;
        // 交换两个异常节点的数值
        swap(nodes[i]->val, nodes[j]->val);
    }
};

时间复杂度: O(n) 空间复杂度: O(n)

全部评论

相关推荐

10-27 02:29
已编辑
门头沟学院 嵌入式工程师
牛客72783561...:简历不是这么写的,你这两个项目只说了用到了什么技术,却没说取得了什么成果,在我看来这就是你自己做的一个demo,没有价值。你为什么不写你电赛国二的那个项目?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务