LeetCode(99) Recover Binary Search Tree
2015-10-15 14:45
531 查看
题目
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?
分析
给定一颗二叉排序树,它的两个节点被交换,要求在常数空间复杂度内把它恢复为原来的二叉排序树。方法一:我们知道二叉排序树的中序遍历序列为递增的有序序列,首先,中序遍历该二叉树,存储元素序列,然后循环查找元素序列中逆序的两个节点元素,交换之,还原成二叉树即可。该方法需要O(n)的空间,n为节点个数,不满足要求。
查找资料,得到方法二:
递归中序遍历二叉树,设置一个pre指针,记录当前节点中序遍历时的前节点,如果当前节点大于pre节点的值,说明需要调整次序。
有一个技巧是如果遍历整个序列过程中只出现了一次次序错误,说明就是这两个相邻节点需要被交换。如果出现了两次次序错误,那就需要交换这两个节点。
AC代码
/** * 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: //节点p,q为两个逆序节点 , pre为遍历当前root节点的前驱 TreeNode *p = NULL, *q = NULL, *pre = NULL; void recoverTree(TreeNode* root) { if (!root) return; //中序遍历二叉树,查找需要逆序节点 InOrder(root); if (p && q) { int tmp = p->val; p->val = q->val; q->val = tmp; }//if } //中序遍历二叉树root,同时查找树中逆序节点p , q void InOrder(TreeNode *root) { if (!root) return; if (root->left) InOrder(root->left); if (pre != NULL && pre->val > root->val) { if (!p) p = pre; q = root; }//if pre = root; if (root->right) InOrder(root->right); } };
GitHub测试程序源码
相关文章推荐
- 0917词法分析
- js 浏览器兼容问题
- JSON服务器的使用和客户端的解析
- seajs常用配置
- Codevs 1106 篝火晚会
- 激活ITunes Connect时报错,{{ l10n.interpolate('ITC.HeaderFooter.PrivacyPolicyLinkText') }}
- HDU 4411 Arrest 最小费用最大流(题意+建图)
- Oracle学习(九)之 函数
- IOS开发基础知识--碎片24
- NGINX 健康检查和负载均衡机制分析
- CentOS 7 移植到了 32位(i386)
- mp4解析
- 如何用property控制inputreader中拦截相应的virtual key
- 【综合】工作中的小总结
- 页面以base64输出图片
- 正确使用Android性能分析工具——TraceView
- html 关于内部是float元素的外部div高度为0的解决方法!
- Xml通用操作类
- Interface Builder操作
- 【ZJOI2007】【BZOJ1059】矩阵游戏