lintcode--二叉搜索树交换节点(leetcode--Recover Binary Search Tree)

题目描述:
在一棵二叉搜索树中, 只有两个节点是被交换的. 找到这些节点并交换, 如果没有节点被交换就返回原来的树的根节点.

样例:
给一棵BST:

lintcode--二叉搜索树交换节点(leetcode--Recover Binary Search Tree)_第1张图片
返回
这里写图片描述

思路讲解:
这道题我的一开始思路是通过先序遍历得到一个数组,然后将数组重新排序好,然后再重新赋值给原二叉树。后面发现实现不了。(个人太菜了)
然后发现另外一种别的方法,如对于数组1,2,7,4,5,6,3,8,9,如何判断是哪两个元素发生了交换呢?
不难发现,新的数组中存在两对逆序并相邻的数字,即7,4和6,3,造成这出现的原因,正是发生了一次交换,由于一定是较小的数换到了较大数的位置(向后),较大的数换到了较小数的位置(向前)。所以在这两对中,我们可以简单的判断出:是前一对的较大数和后一对的较小数发生了交换。
现在我们只需要将这两个节点找出来即可,重点是对上一层节点的存储。

具体代码:

class Solution {
public:
    /*
     * @param : the given tree
     * @return: the tree after swapping
     */
    TreeNode * first;
    TreeNode * second;
    TreeNode * pre;
    TreeNode * bstSwappedNode(TreeNode * root) {
        // write your code here
        if(root==NULL){
            return NULL;
        }
        TreeNode *head=root;
        first=NULL;
        second=NULL;
        pre=NULL;

        changenode(head);

        if(first!=NULL&&second!=NULL){
            int tmp=first->val;
            first->val=second->val;
            second->val=tmp;
        }

        return root;
    }
    void changenode(TreeNode * root)
    {
        if(root->left!=NULL)changenode(root->left);

        if(pre!=NULL&&pre->val>root->val){
            if(first==NULL){
                first=pre;
            }
            if(first!=NULL){
                second=root;
            }
        }
        pre=root;
        if(root->right!=NULL)changenode(root->right);
    }
    void printvector(vector<int>res)
    {
        for(int i=0;i<res.size();i++)
        {
            cout<<res[i]<<" ";
        }
        cout<

参考博客:https://www.tianmaying.com/tutorial/LC99

你可能感兴趣的:(lintcode)