当前位置: 首页 > article >正文

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

思路:

二叉搜索树的中序遍历是递增序列,可以在中序遍历中记录两个需要交换的节点,直到遍历完毕之后,对两个节点的值进行交换即可得到正确的二叉搜索树

比如中序序列为  1  2   3  7  5  6  4(7比5大记录7为x,6比4大记录4为y,交换x与y)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //用于记录交换节点以及前一个节点
    TreeNode* x = nullptr;
    TreeNode* y = nullptr;
    TreeNode* pre = nullptr;
    void recoverTree(TreeNode* root) {
        //进行中序遍历
        dfs(root);
        //如果交换节点都不为空,则进行val交换得到结果
        if(x!=nullptr&&y!=nullptr){
            int temp = x->val;
            x->val = y ->val;
            y->val = temp;
        }
    }
    //中序遍历
    void dfs(TreeNode* root) {
        //如果为空节点,返回
        if(root == nullptr) return;
        //遍历左子树
        dfs(root->left);
        //如果当前节点为第一个节点,则pre = 当前节点
        if(pre == nullptr) pre = root;
        //如果当前节点前面有节点
        else{
            //如果当前节点的值小于前一个节点的值
            if(pre->val > root->val){
                //记录当前节点的值,不停的更新y的节点
                y = root;
                //如果另一个节点为空,则记录前一个节点,固定x节点
                if(x == nullptr) x = pre;
            }
            //每次遍历都需要更新pre节点,即当前节点为前一个节点
            pre = root;
        }
        //遍历右子树
        dfs(root->right);
    }
};


http://www.kler.cn/a/227718.html

相关文章:

  • DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
  • langgraph实现 handsoff between agents 模式 (1)
  • Day24-【13003】短文,数据结构与算法开篇,什么是数据元素?数据结构有哪些类型?什么是抽象类型?
  • 从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)
  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • C语言------数组从入门到精通
  • 【QT+QGIS跨平台编译】之二十:【xerces+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 寒假 day1
  • 实时聊天系统
  • 网络原理TCP/IP(4)
  • 老版本labelme如何不保存imagedata
  • 【TCP】四次挥手(终止连接)
  • Logback学习
  • 新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)
  • 修改MFC图标
  • 每日一练 | 华为认证真题练习Day178
  • 【Pwn | CTF】BUUCTF rip1
  • 编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程
  • SQL报错注入
  • 使用wda框架实现IOS自动化测试详解
  • MyBatis之环境搭建以及实现增删改查
  • 幻兽帕鲁服务器搭建:专用服务器设置全攻略
  • XUbuntu22.04之如何创建、切换多个工作区(二百零九)
  • 微信网页授权之使用完整服务解决方案
  • docker入门教程之将应用程序容器化
  • 突破编程_C++_基础教程(指针(一))