LeetCode OJ:Recover Binary Search Tree(恢复二叉搜索树)
2015-10-28 21:10
543 查看
Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
首先是O(N)空间的方法,用递归:
下面这个方法是看别人实现的,想法很好,维护两个指针,一个指向前面一个违反条件的,一个指向后面一个,q不断的进行更新,代码如下:
Recover the tree without changing its structure.
首先是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 { public: void recoverTree(TreeNode* root) { vt.clear(); vi.clear(); if(!root) return; tranverse(root); sort(vi.begin(), vi.end()); for_each(vt.begin(), vt.end(), [this](TreeNode * t){static int i = 0; t->val = vi[i++];}); } void tranverse(TreeNode * root) { if(!root) return; tranverse(root->left); vt.push_back(root); vi.push_back(root->val); tranverse(root->right); } private: vector<TreeNode *> vt; vector<int> vi; };
下面这个方法是看别人实现的,想法很好,维护两个指针,一个指向前面一个违反条件的,一个指向后面一个,q不断的进行更新,代码如下:
class Solution { public: void recoverTree(TreeNode* root) { p = q = prev = NULL; if(!root) return; tranverse(root); swap(p->val, q->val); } void tranverse(TreeNode * root) { if(!root) return ; tranverse(root->left); if(prev && (prev->val > root->val)){ if(!p) p = prev;//这里应该注意 q = root;//注意为什么q取的是root } prev = root; tranverse(root->right); } private: TreeNode * p, * q; TreeNode * prev; };
相关文章推荐
- zoj 1242
- 零基础ios开发(五 深入理解继承—植物大战僵尸 )
- 1012: 弟弟的作业
- DP-POJ-3616-Milking Time
- hdu 2546 饭卡(01背包)
- C#写的windows应用程序打包
- video视频操作之暂停开始放大缩小
- UWP app HelloWorld 的创建
- linux使用
- 一篇文章教你读懂Makefile
- 关于中国土地制度
- 【PAT】1030. Travel Plan (30)
- mysql 用户管理和权限设置
- 并发编程 学习笔记(二)
- Java并发编程:并发容器之CopyOnWriteArrayList
- 看到一个修改VC6.0字体的方法,存一下!
- Java中迭代器初深
- 迭代器
- GA算法-R语言实现
- 运维之Centos apache vsftpd配置