leetcode做题笔记99. 恢复二叉搜索树

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

思路一:模拟题意

cpp 复制代码
int midOrder(struct TreeNode **pre, struct TreeNode **err1, struct TreeNode **err2, struct TreeNode *root)
{
    if (root == NULL) return 0;
    
    if (midOrder(pre, err1, err2, root->left) == -1) return -1;
    if (*pre != NULL && (*pre)->val > root->val) {
        if (*err1 == NULL) {
            *err1 = *pre;
            *err2 = root;
        } else {
            *err2 = root;
            return -1;
        }
    }
    *pre = root;
    if (midOrder(pre, err1, err2, root->right) == -1) return -1;
    return 0;
}

void recoverTree(struct TreeNode* root){
    struct TreeNode *pre = NULL;
    struct TreeNode * err1 = NULL;
    struct TreeNode * err2 = NULL;
    midOrder(&pre, &err1, &err2, root);
    
    int tmp;
    tmp = err1->val;
    err1->val = err2->val;
    err2->val = tmp;
    return;
}

分析:

本题要将错误交换的两个数交换回来,即可能有两种情况,一是两个值所在的节点相邻,只有一对错误值,将错误值的两个数交换位置即可,二是两个值所在的节点不相邻,即有两对错误值,将第一对错误值前面的数和第二对错误值后面的数交换位置即可解决。

总结:

本题考察二叉树交换值的应用,分类讨论错误的情况再加以解决即可做出

相关推荐
贾saisai8 分钟前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫12 分钟前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java13 分钟前
JDBC笔记
笔记
GEEKVIP14 分钟前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
jiao000012 小时前
数据结构——队列
c语言·数据结构·算法
铁匠匠匠2 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
Moliay3 小时前
【资料分析】刷题日记2
笔记·公考·行测·常识·资料分析
迷迭所归处3 小时前
C++ —— 关于vector
开发语言·c++·算法
leon6253 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林3 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先