Leetcode 99. 恢复二叉搜索树(DAY 22 Hard含题解)
发布日期:2021-06-30 22:24:27 浏览次数:2 分类:技术文章

本文共 1604 字,大约阅读时间需要 5 分钟。

原题题目

在这里插入图片描述



思路分析

首先对于中序数组 比如【1、2、3、4、5、6】

交换两个数 有两种情况 相邻的和不相邻的
对于 相邻的两个数比如交换 2、3
则得到【1、3、2、4、5、6】
对于我们有序序列判断就是 前一个节点的值比当前节点的值小 对于第一个数
前一个节点设置为NULL判断即可 则会出现一个逆序情况 3->2
对于此时我们只需要交换这两个节点的值 2、3即可

对于不相邻的两个数 比如交换 2、6

则得到【1、6、3、4、5、2】 则会出现 6->3 5->2两个逆序情况
此时需要交换 第一个逆序的前面的 和 第二个逆序的后面的节点值即可



代码实现(首刷自解)

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     struct TreeNode *left; *     struct TreeNode *right; * }; */#define MAX 1001void recoverTree(struct TreeNode* root){
if(!root) return; int size = 0,top = 0,wrongtimes = 0;//记录顺序颠倒次数 //change1 change2主要记录两个需要交换值的两个节点 struct TreeNode* stack[MAX],*change1,*change2,*preroot = NULL; //这里就是中序遍历迭代法 while(size > 0 || root) {
while(root) {
stack[size++] = root; root = root->left; } root = stack[--size]; //这里就是中序遍历改动的地方 if(preroot && root->val < preroot->val) {
//此时出现了一次 则先记录相邻两节点 if(!wrongtimes) {
change1 = preroot; change2 = root; wrongtimes++; } //再进入时则说明出现了两次了 直接交换退出即可 //这里的root就是第二个逆序后面的节点 else {
int temp = root->val; root->val = change1->val; change1->val = temp; return; } } preroot = root; root = root->right; } //这里就是当已经退出中序遍历时 第二个逆序还没有出现 //则此时逆序情况为 相邻 交换相邻节点值即可退出 int temp = change1->val; change1->val = change2->val; change2->val = temp; return;}


通过结果

在这里插入图片描述

转载地址:https://love6.blog.csdn.net/article/details/112428143 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Leetcode 297. 二叉树的序列化与反序列化(DAY 23)(Hard细节挺多的 需要调试一会 含题解)
下一篇:Leetcode 1028. 从先序遍历还原二叉树(DAY 21)(划开新时代 Hard第一题 Hard含题解)

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月28日 14时37分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章