【二叉树】查找搜索二叉树被调换节点

知识点

搜索二叉树的父节点大于左孩子节点的值,小于右孩子节点的值。中序遍历搜索二叉树得到的序列为升序序列。

题目

一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。

给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。

思路

调换位置后,中序遍历得到的序列一定不是升序序列。下面根据调换位置后二叉树的中序遍历结果得到调换位置的节点值。

如原搜索二叉树中序遍历结果为1 2 3 4 5,如果节点2和5交换,则中序遍历结果变为1 5 3 4 2。可以看到这个序列中有两次降序:第一次为5->3,第二次为4->2. 在这个例子中第一个错误节点是第一次降序中较大的节点(即5),第二个错误节点是第二次降序中较小的节点(即2)。

如果只有一次降序,如将节点3和4交换,中序遍历结果为1 2 4 3 5,可以看到序列中有一次降序4->3,则第一个错误节点是降序中较大的节点(即4),第二个错误节点是降序中较小的节点(即3)。

综合来看,第一个错误节点是第一次降序中的较大节点,第二个错误节点是最后一次降序中的较小节点。

代码实现

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class FindErrorNode {
public:
    void inorderTraverse(vector& inOrder,TreeNode* root){
        if(root==NULL)
            return;
        inorderTraverse(inOrder,root->left);
        inOrder.push_back(root->val);
        inorderTraverse(inOrder,root->right);
    }
    vector findError(TreeNode* root) {
        // write code here
        vector result;
        vector inOrder;
        int first = 0;//存储调换节点中较小的那个
        int second = 0;//存储调换节点中值较小的那个
        inorderTraverse(inOrder,root);
        bool firstdown = true;
        for(int i = 0;i

注意题目要求先输出调换节点中的最大值,后输出最小值。

你可能感兴趣的:(算法,二叉树)