博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Recover Binary Search Tree
阅读量:5230 次
发布时间:2019-06-14

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

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:

A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

思路:BST就是对应的InOrder,1) 那么只需要InOrder,维持一个当前的Val,然后看下一个是不是比当前的大,如果不大,则记录位置,直到找到2个位置first 和 second,最后交换就可以  2) 不管O(n) space constraits的话,可以用一个数组保存遍历出来的 val,一个保存出来的 pointer,然后排序val数组,再全部给pointer赋值就OK.思路1的话,递归或者非递归都OK。

        如果是O(1)的space呢?That's MorrisInOrder.

class Solution {public:    void recoverTree(TreeNode *root) {        if (!root){            return;        }        /**        {68,41,#,-85,#,-73,-49,-98,#,#,#,-124}    ==> {68,41,#,-73,#,-85,-49,-98,#,#,#,-124}        {1,2,3} => {2,1,3}                first是找到第一个失配的pair 
的pre : pre->val < current->val second是找到最后一个失配的pair
的current : pre->val < current->val 当然,first和second可能相等 因为先访问到,first是大的,那么说明争取的位置不在这里 后访问到,second是小的,说明正确的位置也不在这里,永远都是相邻的pair,记住第一个pair的头和最后一个pair的尾巴 8 / \ 5 10 / \ / 我们只需要找到9和2的位置,然后swap就ok, (9,3) 的first (8,2)的second. 3 6 |2| / \ \ |9| 4 7 另一种视角:|9| 3 4 5 6 8 |2| 10 需要变成: 2 3 4 5 6 8 9 10 遍历的时候,记住<9,3>的first和<8,2>的second 最后swap(first->val,second->val) */ TreeNode * first = NULL, *second = NULL; TreeNode * current = root; TreeNode * prev = NULL, *prev2 = NULL; while(current){ if (!current->left){ //visit first指向第一个不符合的prev结点 //second指向不符合的second结点 if (prev && current->val < prev->val){ if (!first){ first = prev; } second = current; } prev = current; //prev指针forward current = current->right; continue; //注意的这个continue不能丢掉 } TreeNode * p = current->left; while(p->right && p->right != current){ p = p->right; } if (!p->right){ //threading p->right = current; current = current->left; } //注意这里threading的时候,prev肯定不可能是空的 if (p->right == current){ //unthreading //vist if (current->val < prev->val){ if (!first){ first = prev; } second = current; } prev = current; //prev指针forward p->right = NULL; current = current->right; } } if (first && second){ swap(first->val,second->val); return; } }};

 

 

转载于:https://www.cnblogs.com/kwill/archive/2013/06/15/3137289.html

你可能感兴趣的文章
常见的选择同意之后才能点击下一步按钮
查看>>
webpack-dev-server disableHostCheck导致 invalid host header
查看>>
SQL Prompt激活
查看>>
Python中常用数字类型
查看>>
binary hacks读数笔记(装载)
查看>>
Luogu P4822 [BJWC2012]冻结
查看>>
一分钟搞定 Android studio 2.3项目升级到3.0
查看>>
way
查看>>
PHP定界符的用法
查看>>
iOS发布证书申请
查看>>
前端性能监控工具
查看>>
第九篇 文件操作
查看>>
NSString的常用代码(转)
查看>>
UVA10719 - Quotient Polynomial
查看>>
OSPFV3实验
查看>>
linux的top命令参数详解
查看>>
载入Properties文件中的配置项信息
查看>>
Roslyn Cookbook
查看>>
ftp功能深度剖析 + 线程 031
查看>>
在本地新建网站报错未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。...
查看>>