[leetcode] 99.Recover Binary Search Tree
来源:互联网 发布:各类化验单制作软件 编辑:程序博客网 时间:2024/04/30 04:31
题目:
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?
confused what “{1,#,2,3}” means? > read more on how binary tree is serialized on OJ.
题意:
一棵二叉树中有两个节点互相交换了位置,找出这两个节点。
思路:
1.我们知道二叉搜索树的中序遍历的结果是元素递增的排列,如果某两个元素交换了位置,那么就不会保证递增性。比方说原来下标为i,j的两个元素互相交换了位置即A[i]与A[j]互相交换了位置,那么现在A[i+1] < A[i], A[j] <A[j-1],我们可以找到比前面元素小的两个元素即A[i+1],A[j]也即找到了A[i],A[j]。采用递归的方法进行遍历,中间过程,只比较上一个元素。
以上。代码如下:
class Solution {public: void recoverTree(TreeNode* root) { if (root == NULL)return; TreeNode* first = NULL, *second = NULL; TreeNode* last = new TreeNode(INT_MIN); recoverTree(root, first, second, last); if (first == NULL)return; swap(first->val, second->val); } void recoverTree(TreeNode* root, TreeNode* &first, TreeNode* &second, TreeNode*& last) { if (root == NULL)return; recoverTree(root->left, first, second, last); if (root->val < last->val) { if (first == NULL) { first = last; second = root; } else { second = root; return; } } last = root; recoverTree(root->right, first, second, last); }};
2.之前使用递归的方式进行遍历,平均需要额外的空间复杂度是O(lgn)(递归的深度,最差可能是O(n))。采用Morris algorithm进行中序遍历,可以参考http://blog.csdn.net/u014673347/article/details/47974555
代码如下:
class Solution {public: void recoverTree(TreeNode* root) { if (root == NULL)return; TreeNode* first = NULL, *second = NULL; TreeNode* last = new TreeNode(INT_MIN); TreeNode* prev = NULL, *curr = root; while (curr != NULL) { if (curr->left == NULL) { if (last->val > curr->val) { if (first == NULL) { first = last; second = curr; } else{ second = curr; } } last = curr; curr = curr->right; } else { prev = curr->left; while (prev->right != NULL && prev->right != curr) prev = prev->right; if (prev->right == NULL) { prev->right = curr; curr = curr->left; } else { if (last->val > curr->val) { if (first == NULL) { first = last; second = curr; } else{ second = curr; } } last = curr; prev->right = NULL; curr = curr->right; } } } if (first == NULL)return; swap(first->val, second->val); }};
- LeetCode 99. Recover Binary Search Tree
- [LeetCode]99.Recover Binary Search Tree
- [Leetcode] 99. Recover Binary Search Tree
- LeetCode --- 99. Recover Binary Search Tree
- [leetcode] 99.Recover Binary Search Tree
- leetcode 99. Recover Binary Search Tree
- Leetcode 99. Recover Binary Search Tree
- LeetCode 99. Recover Binary Search Tree
- LeetCode 99. Recover Binary Search Tree
- Leetcode 99. Recover Binary Search Tree
- LeetCode 99. Recover Binary Search Tree
- [LeetCode] 99. Recover Binary Search Tree
- leetcode-99. Recover Binary Search Tree
- LeetCode 99. Recover Binary Search Tree
- [LeetCode] 99. Recover Binary Search Tree
- leetcode 99. Recover Binary Search Tree
- leetcode 99. Recover Binary Search Tree
- [leetcode]99. Recover Binary Search Tree
- 【ZOJ3261】【离线并查集】【逆序】【好题】
- java进行多张图片组合一张图片
- Atitit.使用引擎加脚本架构的设计 使用php,js来开发桌面程序。。
- Activity 启动模式以及Inent Flags理解
- linux Web服务程序监控shell脚本
- [leetcode] 99.Recover Binary Search Tree
- C Looooops(扩展欧几里得求模线性方程)
- EdtText默认显示数字键盘,不强制输入数字
- python学习笔记
- 各类排序算法性能对比简述
- atitit.jquery tmpl模板总结 .doc
- 使用 Sahi 实现 Web 自动化测试
- sscanf
- Android Toolbar样式定制详解