99. Recover Binary Search Tree

来源:互联网 发布:linux while加快循环 编辑:程序博客网 时间:2024/06/05 07:17

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?


一棵排序二叉树中有两个节点被交换了,要求恢复排序二叉树。想法是通过中序遍历(因为排序二叉树中序遍历是升序的),看序列中哪里出现了乱序。这里有两种情况,如果是只有一处乱序的,说明是相邻的两个节点交换了,则把它们换过来就可以了。如果有两处乱序,则要交换两处的节点。具体实现看下面的代码。


代码:

class Solution{public:void recoverTree(TreeNode* root) {pre = new TreeNode(INT_MIN);inOrder(root);if(errs.size() == 1){swap(errs[0], pres[0]);}else if(errs.size() == 2){swap(pres[0], errs[1]);}}private:vector<TreeNode*>errs, pres;TreeNode* pre;void inOrder(TreeNode* root){if(!root) return;inOrder(root->left);if(pre->val > root->val) {pres.push_back(pre);errs.push_back(root);}pre = root;inOrder(root->right);}void swap(TreeNode* n1, TreeNode* n2){::swap(n1->val, n2->val);}};


0 0
原创粉丝点击