【leetcode 刷題日記】24-恢復二叉搜索樹 II(C++)

恢復二叉搜索樹

題目

二叉搜索樹中的兩個節點被錯誤地交換。
請在不改變其結構的情況下,恢復這棵樹。

示例

示例 1:

輸入: [1,3,null,null,2]

1
/
3

2

輸出: [3,1,null,null,2]

3
/
1

2

示例 2:

輸入: [3,1,4,null,null,2]

3
/
1 4
/
2

輸出: [2,1,4,null,null,3]

2
/
1 4
/
3

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

思路

何爲二叉搜索樹?

二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:
若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
它的左、右子樹也分別爲二叉排序樹。

可以知道在中序遍歷的情況下,是升序的。那麼思路就有了,把樹用中序遍歷後,再進行排序,再次進行中序遍歷,與sort之後的值進行比對,不等時進行值的交換。

代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution 
{
public:
    vector<int>res;
    vector<int>temp;
    int now1=INT_MIN;
    int now2=INT_MIN;
    TreeNode*p1=NULL;
    TreeNode*p2=NULL;
    //中序遍歷
    void inorder(TreeNode *now)
    {
        if(now)
        {
            inorder(now->left);
            res.push_back(now->val);
            inorder(now->right);
        }
    }

    void find(TreeNode *now)
    {
        if(now!=NULL)
        {
            find(now->left);
            if(now->val==now1)
            {
                p1=now;
            }
            if(now->val==now2)
            {
                p2=now;
            }
            find(now->right);
        }
    }
    void recoverTree(TreeNode* root) 
    {
        inorder(root);
        temp=res;
        sort(temp.begin(),temp.end());
        for(int i=0;i<temp.size();i++)
        {
            if(temp[i]!=res[i])
            {
                if(now1==INT_MIN)
                now1=temp[i];
                else if(now2==INT_MIN)
                {
                    now2=temp[i];
                    break;
                }
            }
        }
        find(root);
        p1->val=now2;
        p2->val=now1;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章