LeetCode OJ - Recover Binary Search Tree

来源:互联网 发布:淘宝可以改好评吗 编辑:程序博客网 时间:2024/06/06 03:16

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);    }};


0 0
原创粉丝点击