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、递归记录两个无序元素,最后交换
首先看一个升序数组中,若两个数被错误交换了,如何处理:
#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
using namespace std;
int node1 = INT_MIN;
int node2 = INT_MIN;
void DFS(int *A, int n) {
for(int i = 0; i < n - 1; i++) {
if(A[i] > A[i+1]) {
if(node1 == INT_MIN) {
node1 = i;
node2 = i + 1;
} else {
node2 = i + 1;
}
}
}
int tmp = A[node1];
A[node1] = A[node2];
A[node2] = tmp;
}
int main(int argc, char* argv[])
{
int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 26, 13, 14, 12};
int n = sizeof(A) / sizeof(int);
DFS(A, n);
for(int i = 0; i < n; i++) {
cout << A[i] << " ";
}
cout << endl;
return 0;
}
中序遍历相当于依次访问left、root、right,而pre依次记录的子访问的前一个节点。如同pre1与root1比较,若pre1 > root1则表明pre1为问题节点;若pre2 > root2则root2为问题节点。记录这两个节点并交换。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode *node1, *node2;
TreeNode *pre;
void traverse(TreeNode *root) {
if (root == NULL) {
return;
}
traverse(root->left);
if (pre != NULL && pre->val > root->val) {
node2 = root;
if (node1 == NULL) {
node1 = pre;
}
}
pre = root;
traverse(root->right);
}
public:
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
node1 = node2 = NULL;
pre = NULL;
traverse(root);
swap(node1->val, node2->val);
}
};