Recover Binary Search Tree
2015-05-30 22:29
337 查看
思路:
方法一:首先用中序遍历把树中的节点放到数组中,因为是对BST的中序遍历,所以数组应该是增序的。但是有两个节点逆序,找到它们:先从头到尾找到一个节点的val大于后面节点的val的节点,这就是第一个逆序的节点,然后从尾到头找一个节点的val小于前面节点的val的节点,这就是第二个逆序的节点,交换val,OK。
时间复杂度O(N),空间复杂度O(N)。
方法二:
方法一:首先用中序遍历把树中的节点放到数组中,因为是对BST的中序遍历,所以数组应该是增序的。但是有两个节点逆序,找到它们:先从头到尾找到一个节点的val大于后面节点的val的节点,这就是第一个逆序的节点,然后从尾到头找一个节点的val小于前面节点的val的节点,这就是第二个逆序的节点,交换val,OK。
时间复杂度O(N),空间复杂度O(N)。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: void dfs(vector<TreeNode*>& sort_list, TreeNode* node) { if(node == nullptr) return; if(node->left != nullptr) dfs(sort_list, node->left); sort_list.push_back(node); if(node->right != nullptr) dfs(sort_list, node->right); } public: void recoverTree(TreeNode* root) { vector<TreeNode*> sort_list; //get node from tree based on inorder dfs(sort_list, root); //find two node TreeNode *first, *second; int size = sort_list.size(); //find : from begin to end for(int i = 0; i < size - 1; ++i) { if(sort_list[i]->val > sort_list[i+1]->val) { first = sort_list[i]; break; } } //find : from end to begin for(int i = size-1; i > 0; --i) { if(sort_list[i]->val < sort_list[i-1]->val) { second = sort_list[i]; break; } } //swap swap(first->val, second->val); } };
方法二:
相关文章推荐
- javase 知识1
- 2015年百度之星初赛(1) --- B 找连续数
- 算法学习:简单起步
- ubuntu下安装tomcat
- 操作系统实验——工作集模型下的内存管理模拟
- swust oj 1132--Coin-collecting by robot
- 脑残问题收集
- PHP 异常处理
- 站立会议06(第二阶段)
- Android的自动完成文本框-android学习之旅(二十六)
- Android的自动完成文本框-android学习之旅(二十六)
- Android的自动完成文本框-android学习之旅(二十六)
- JQuery中操作Css样式的方法
- leetcode刷题, 总结,记录,备忘 171
- Css浮动
- jQuery选择器总结
- a标签的href与onclick中使用js的区别
- Android 中Application的作用
- iOS 自动布局扩展应用:代码中动态调整布局常量
- 幸运观众抽奖