首页 > 代码库 > Recover Binary Search Tree
Recover Binary Search Tree
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?
思路:使用递归对输入二叉树进行中序遍历。对于二叉搜索树,其中序遍历得到的是一个递增的序列。由于输入二叉搜索树有两个元素被交换了,所以实际我们得到的并不是一个递增的序列。
假设递增序列:{1,2,3,4,5},显然,交换两个元素存在两种情况:一种是被交换的两个元素相邻,比如交换1和2,将得到{2,1,3,4,5};另一种是被交换的两个元素不相邻,比如交换1和3,将得到{3,2,1,4,5}。第一种情况中序遍历序列将出现一个逆序对,即{2,1};而第二种情况中序遍历序列将出现两个逆序对,即{3,2}和{2,1}。因此,我们只需找出中序遍历序列中的逆序对,便可完成对二叉搜索树的修正。
为了在递归调用中比较相邻元素,使用全局指针pre指向前一次输出的元素。每次比较当前输出元素与前一次输出元素的大小,若为逆序对,则使用全局指针first和second分别指向它们;若当前逆序对为第二个逆序对,我们只需修改second指针,使它指向当前元素。
1 class Solution { 2 public: 3 void recoverTree( TreeNode *root ) { 4 prev = first = second = 0; 5 InOrder( root ); 6 if( first ) { swap( first->val, second->val ); } 7 return; 8 } 9 private:10 void InOrder( TreeNode*& node ) {11 if( !node ) { return; }12 InOrder( node->left );13 if( prev && prev->val > node->val ) {14 second = node;15 if( !first ) { first = prev; }16 }17 prev = node;18 InOrder( node->right );19 }20 TreeNode *prev, *first, *second;21 };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。