L52. Recover BST | Correct BST with two nodes swapped

Поділитися
Вставка
  • Опубліковано 26 жов 2024
  • Entire DSA Course: takeuforward.o...
    Check our Website:
    Linkedin/Instagram/Telegram: linktr.ee/take...
    #treeSeries #striver #placements

КОМЕНТАРІ • 127

  • @takeUforward
    @takeUforward  3 роки тому +53

    Please like and share :)

  • @AdityaSharma-nr7qn
    @AdityaSharma-nr7qn 3 роки тому +76

    What a co incidence, I was exactly studying the same problem and wasn't able to understand on my own and here comes Striver for rescue 😀😀

  • @ajaykr2811
    @ajaykr2811 Рік тому +26

    instead of making third variable we can also update the middle variable when there is a 2nd violation

  • @shinewanna3959
    @shinewanna3959 Рік тому +17

    As u initialize prev as INT_MIN then u don't need to check prev != null in inorder recursive. Just correction. You are already great.

    • @darkexodus6404
      @darkexodus6404 Рік тому +2

      In leetcode question the values are in range of [INT_MIN, INT_MAX], so this won't work there.

  • @ujjwalverma5893
    @ujjwalverma5893 2 роки тому +14

    We can avoid the middle pointer also just keep updating the first and second pointers -
    class Solution {
    private TreeNode first;
    private TreeNode second;
    private TreeNode prev;
    public void recoverTree(TreeNode root) {
    inorder(root);
    int temp = first.val;
    first.val = second.val;
    second.val = temp;
    }
    public void inorder(TreeNode root) {
    if(root == null) return;
    inorder(root.left);
    // Keep updating first and second which points to first and second numbers to swap
    if(prev != null && root.val < prev.val) {
    if(first == null) {
    first = prev;
    second = root;
    } else {
    second = root;
    }
    }
    prev = root;
    inorder(root.right);
    }
    }

  • @jiteshsingh4899
    @jiteshsingh4899 2 роки тому +17

    my mom said "ye ladka kitni mehnat karta h" - what a explanation striver bhaiya

  • @SatyamKumar-bw4vi
    @SatyamKumar-bw4vi 2 роки тому +7

    Hare Krishna..!
    Got Placed in R & D of a Product Based Company..!
    Thanks Bhaiya..!
    I will tag you in Linkedln post in some time

  • @shashankbajpai5659
    @shashankbajpai5659 2 роки тому +7

    add morris traversal and we can do this problem on O(1) space as well.

  • @namratam1522
    @namratam1522 Рік тому +1

    You are the best instructor !! Thanks a ton for this content ! You are bringing a revolution striver!

  • @krishnaradhey2814
    @krishnaradhey2814 Рік тому +5

    LeetCode 99 problem Can be done with morris traversal

  • @stith_pragya
    @stith_pragya 11 місяців тому +1

    Thank You So Much for this wonderful video...🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

  • @ZebraZodiac
    @ZebraZodiac 5 місяців тому +1

    If trying to code in python use list to store prev,first,last and middle (or prev and last if not using middle) as when prev is just declared as just an argument, it gets reassigned and will not get passed on to the next recursive call.

  • @chitranshjain5075
    @chitranshjain5075 2 роки тому +2

    Such a brilliant explanation of the problem! Thank you very much fir helping all of us!

  • @dhrutidesai278
    @dhrutidesai278 7 місяців тому

    Thankyou sir👍For always helping by your approaches

  • @ayushbhargava8400
    @ayushbhargava8400 9 місяців тому

    find the two elements which are not at it's correct place through inorder traversal vector and sorted vector. again perform inorder traversal and have a check on root element if it's equal to incorrect element swap it.

  • @stith_pragya
    @stith_pragya 11 місяців тому +4

    🚨[IMPROVMENT IN THE CODE]:🚨
    Hello Striver Bhaiya,
    1- if you would have done middle = root in the else part then you wouldnt have had any requirement of the variable "last", you can do it using only two variables.
    2- You could have also used an array of size 3 instead of global variables.
    But if your intention to was make code simpler for others to understand then it is all fine.....👍

    • @gyanendrasaurav877
      @gyanendrasaurav877 9 місяців тому +1

      i also solved it using two vaiables because if in first case we can find the prev value at which the root value is less than prev then that means we find the greater element so the next voilation is always less than the first voilation so we can store last as root

  • @ShilpiKumari-i3s
    @ShilpiKumari-i3s 2 роки тому +3

    //first brute method
    vectorv;
    int i=0;
    void tra(Node *root)
    {
    if(!root) return;
    tra(root->left);
    v.push_back(root->data);
    tra(root->right);
    }
    void check(Node *root)
    {
    if(!root) return;
    check(root->left);
    if(v[i]!=root->data)
    {
    swap(root->data,v[i]);
    }
    i++;
    check(root->right);
    }
    void correctBST( struct Node* root )
    {
    tra(root);
    sort(v.begin(),v.end());
    check(root);
    }

  • @kalpeshmali1476
    @kalpeshmali1476 3 роки тому +3

    After watching your tree series i m pretty confident in Binary trees and bst 🔥🔥🔥🔥🔥🔥🔥

  • @timjoyalle318
    @timjoyalle318 2 роки тому +4

    This dude's neighbors get free lectures. Hope they appreciate it.

  • @amanbhadani8840
    @amanbhadani8840 2 роки тому +3

    Absolutely brilliant explanation as well as mind blowing implementation of code,just loved it bhaiya.

  • @SharuxD
    @SharuxD 2 роки тому +1

    The logic you have given to solve this is brilliant af. GG

  • @Ramu9119
    @Ramu9119 9 місяців тому

    excellent explanation striver bhai

  • @pratikmhatre4815
    @pratikmhatre4815 2 роки тому +5

    I always feel motivated by your passion of explaining problems👍

  • @tempbot7190
    @tempbot7190 4 місяці тому

    Much Love from London❤

  • @studyafa7159
    @studyafa7159 8 місяців тому +2

    i think there is no need of " prev != null" in line 27

  • @ishakhutafale1163
    @ishakhutafale1163 4 місяці тому

    Watch these videos, and you'll never forget the importance of inorder traversal for BSTs!

  • @anubhavpabby6856
    @anubhavpabby6856 2 роки тому +8

    Thank you striver bhaiya for making such a great series and it's helping me out in placement preparation

    • @parthsalat
      @parthsalat 2 роки тому +2

      You seem to like teddy bears a lot

  • @kakarotsv50
    @kakarotsv50 Рік тому

    Awesome explanation

  • @aakashgoswami2356
    @aakashgoswami2356 2 роки тому +15

    Brute force Code:
    class Solution {
    public:
    void inorderTraversal(TreeNode* root,vector&arr){

    if(root==NULL)
    return;

    inorderTraversal(root->left,arr);
    arr.push_back(root->val);
    inorderTraversal(root->right,arr);
    }

    void recoverBST(TreeNode* root, vector&arr,int &i){
    if(root==NULL)
    return;

    recoverBST(root->left,arr,i);
    if(root->val != arr[i]){
    root->val = arr[i];
    }
    i++;
    recoverBST(root->right,arr,i);

    }

    void recoverTree(TreeNode* root) {
    vectorarr;
    inorderTraversal(root,arr);
    sort(arr.begin(),arr.end());
    // for(auto ar:arr)cout

    • @susantakumardutta6283
      @susantakumardutta6283 Рік тому +1

      We have to make variable i, a global variable. So, that it can get updated after every recursive call.

  • @adiin-1940
    @adiin-1940 Рік тому +1

    Shouldn't line number 24 of C++ be , if(prev ->Val != INT_MIN &&.....) rather than if(prev!=NULL &&....) because prev has already been set to a TreeNode with a value of INT_MIN so it will never be NULL?

    • @mayankbharti531
      @mayankbharti531 Рік тому +1

      just using "if(root->val < prev->val)" is fine as the first root->val will always be greater than the INT_MIN so it automatically won't check for the first node.

  • @sreekanthyadav5801
    @sreekanthyadav5801 4 місяці тому +1

    For many problems in BST,
    MORRIS Inorder approach is giving Stack Overflow error (RUN TIME ERROR).
    Is it same with everybody ?

  • @jerrywong5140
    @jerrywong5140 2 роки тому +2

    Very helpful and thorough explanation, love it!

  • @peddikarthik7832
    @peddikarthik7832 Рік тому

    even if we keep all variables and functions of class in public, code still works. But why are we keeping private for some functions and variables ?

  • @prasadm3614
    @prasadm3614 Рік тому

    Congratulations on 3 Lakh Subscribers

  • @tusharagarwal5306
    @tusharagarwal5306 7 місяців тому +1

    13:55 which online coding judge or editor is that??

  • @muditkhanna8164
    @muditkhanna8164 Рік тому

    but what if there are more than one nodes that are swapped?

  • @Manjot_singh2002
    @Manjot_singh2002 Місяць тому

    15:20 the ans is comming incorrect if we just swap the 49 and 50th line but Y case to un mein se ek hi chlega aggy peeechy sy kya farak pdta hai

  • @vinaygoswami5374
    @vinaygoswami5374 2 роки тому

    Quite ambiguous explanation.

  • @justinmyth4980
    @justinmyth4980 2 роки тому

    Why you have used middle,we can just update last instead of middle and it works fine??

    • @placementbaadshah8604
      @placementbaadshah8604 2 роки тому

      ua-cam.com/video/k2haMtP7nvs/v-deo.html

    • @your_name96
      @your_name96 2 роки тому

      I guess it works for understanding the algorithm then optimising it to first and last become easier
      class Solution {
      TreeNode *prev;
      TreeNode *first;
      // TreeNode *middle;
      TreeNode *last;
      public:
      void inorder(TreeNode* root){
      if(!root)return;
      inorder(root->left);
      // the node is not the root element
      if(prev != NULL and (root->val < prev->val)){
      // if this is the first element
      if(first == NULL){
      first = prev;
      }
      last = root;
      }
      prev = root;
      inorder(root->right);
      }
      void recoverTree(TreeNode* root) {
      prev = first = last = NULL;
      inorder(root);

      swap(first->val,last->val);

      }
      };

    • @justinmyth4980
      @justinmyth4980 2 роки тому

      @@your_name96 thanks bro btw which are u a college student?

    • @mohit9975
      @mohit9975 Рік тому +1

      @@justinmyth4980 Islamabad university , lahore

  • @JujareVinayak
    @JujareVinayak 2 роки тому

    Which device is used in videos?? I need one to practice.

  • @spyrowolf2211
    @spyrowolf2211 2 роки тому +2

    what drawing software are u using?

  • @niranjansaha5135
    @niranjansaha5135 2 роки тому +1

    the first method can be optimised to O(n) + O(n) time, by removing the redundant sorting,
    void dfs(Node* root, vector &inorder){
    if(root == NULL) return;
    dfs(root->left, inorder);
    inorder.push_back(root);
    dfs(root->right, inorder);
    }
    void correctBST( struct Node* root )
    {
    vector inorder;
    dfs(root, inorder);
    int ct = 0;
    vector pos;
    for(int i = 1; i < inorder.size(); i++){
    if(inorder[i]->data < inorder[i-1]->data){
    pos.push_back(i);
    ct++;
    }
    }
    if(ct == 1){
    swap(inorder[pos[0] - 1]->data, inorder[pos[0]]->data);
    }
    else if(ct == 2){
    swap(inorder[pos[0]-1]->data, inorder[pos[1]]->data);
    }
    }

  • @adebisisheriff159
    @adebisisheriff159 8 місяців тому

    Thanks Man!!!

  • @16aniketdutta58
    @16aniketdutta58 2 роки тому +1

    The middle pointer can be avoided I guess!!!

    • @placementbaadshah8604
      @placementbaadshah8604 2 роки тому

      ua-cam.com/video/k2haMtP7nvs/v-deo.html

    • @your_name96
      @your_name96 2 роки тому

      yup,
      class Solution {
      TreeNode *prev;
      TreeNode *first;
      // TreeNode *middle;
      TreeNode *last;
      public:
      void inorder(TreeNode* root){
      if(!root)return;
      inorder(root->left);
      // the node is not the root element
      if(prev != NULL and (root->val < prev->val)){
      // if this is the first element
      if(first == NULL){
      first = prev;
      }
      last = root;
      }
      prev = root;
      inorder(root->right);
      }
      void recoverTree(TreeNode* root) {
      prev = first = last = NULL;
      inorder(root);

      swap(first->val,last->val);

      }
      };

  • @ErfanHossainShoaib
    @ErfanHossainShoaib 2 роки тому

    If the inorder sequence is 3 25 7 8 10 15 20 12. Then...

  • @siddhaarthsingh7414
    @siddhaarthsingh7414 2 роки тому +1

    Why prev = new Tree(INT_MIN)
    That is not required !!!!
    Pls Anyone ???

    • @arpitjaswal4210
      @arpitjaswal4210 2 роки тому

      I simply made the prev node NULL and the code still got accepted.

  • @prashantsahu6212
    @prashantsahu6212 2 роки тому +2

    Just wow, the intution was awesome.

  • @Learnprogramming-q7f
    @Learnprogramming-q7f 7 місяців тому

    Thank you Bhaiya

  • @shagunlamba6481
    @shagunlamba6481 2 роки тому +2

    Great explanation , thank you.

  • @philipbrujic4728
    @philipbrujic4728 2 місяці тому

    good video

  • @BhuwanSaretia
    @BhuwanSaretia 11 днів тому

    Instead of using the middle pointer, we can solve this using only two pointers. Here is the detailed solution
    class Solution {
    public:
    TreeNode* prev = NULL;
    TreeNode* first = NULL;
    TreeNode* second = NULL;
    void inOrder(TreeNode*& root) {
    if (root == NULL)
    return;
    inOrder(root->left);
    if (prev == NULL)
    prev = root;
    else
    {
    if (prev->val > root->val)
    {
    if (first == NULL)
    {
    first = prev;
    second = root;
    }
    else
    {
    second = root;
    }
    }
    }
    prev = root;
    inOrder(root->right);
    }
    void recoverTree(TreeNode* root) {
    inOrder(root);
    if (first == NULL)
    return;
    swap(first->val, second->val);
    return;
    }
    };

  • @rounakmukherjee9540
    @rounakmukherjee9540 Рік тому

    We dont need to check the condition if prev!=NULL ;

  • @keshavagrawal1027
    @keshavagrawal1027 4 місяці тому

    can someone tell me why in the last we do (prev=root ) pls if u know try to give a explanation...🙏

  • @gandhijainamgunvantkumar6783
    @gandhijainamgunvantkumar6783 2 роки тому

    Thank you so much striver bhaiya for providing such an amazing content :)

  • @ankurshukla6462
    @ankurshukla6462 3 роки тому +2

    Why you need to allocate space to prev? I don’t think we need it.

  • @gauravshukla5203
    @gauravshukla5203 Рік тому

    If bst is not in correct order you will not get the preorder sorted

  • @shantanukumar4081
    @shantanukumar4081 2 роки тому +1

    Great Explanation !!!

  • @lavanyaprakashjampana933
    @lavanyaprakashjampana933 Рік тому +1

    we love your content and we love you......🤟🖤

  • @jagjiwanchimkar8106
    @jagjiwanchimkar8106 3 роки тому +1

    When this Series Complete

  • @jsuryakt
    @jsuryakt 2 роки тому +4

    class Solution {
    TreeNode prev;
    TreeNode violation1;
    TreeNode violation2;

    public void inorder(TreeNode root) {
    if(root == null)
    return;

    inorder(root.left);

    if(prev != null && prev.val > root.val)
    {
    if(violation1 == null)
    violation1 = prev;
    violation2 = root;
    }

    prev = root;
    inorder(root.right);
    }
    public void recoverTree(TreeNode root) {
    inorder(root);

    int temp = violation1.val;

    violation1.val = violation2.val;
    violation2.val = temp;
    }
    }

  • @mohamedosman3120
    @mohamedosman3120 2 місяці тому

    Thx

  • @sparshsharma6068
    @sparshsharma6068 3 роки тому +1

    Amazing explanation bhaiya!

  • @DeependraSingh-jh8xf
    @DeependraSingh-jh8xf Рік тому

    fire hai bhau

  • @Shivi32590
    @Shivi32590 2 місяці тому

    understood

  • @arsilvyfish11
    @arsilvyfish11 Рік тому

    Excellent explanation

  • @jagjiwanchimkar8106
    @jagjiwanchimkar8106 3 роки тому +2

    When this Serie Complete

  • @UECAshutoshKumar
    @UECAshutoshKumar Рік тому +1

    Thank you sir

  • @Xp-Sam
    @Xp-Sam 2 роки тому +1

    why are we checking prev != NULL

    • @yashverma2986
      @yashverma2986 2 роки тому

      tabhi toh compare kr payega bhai swapping ke lie

    • @Xp-Sam
      @Xp-Sam 2 роки тому +2

      Bhai I think prev is never going to be NULL, because at first we are assigning it with INT_MIN and after that it always stores non-null root value.
      Wo condition hata ke dekho code chalega

    • @your_name96
      @your_name96 2 роки тому

      @@Xp-Sam ha prev ko NULL kar de instead of INT_MIN tabh bhi chalega, my code without middle pointer, easy to optimize if yo examine the conditions in main function:
      class Solution {
      TreeNode *prev;
      TreeNode *first;
      // TreeNode *middle;
      TreeNode *last;
      public:
      void inorder(TreeNode* root){
      if(!root)return;
      inorder(root->left);
      // the node is not the root element
      if(prev != NULL and (root->val < prev->val)){
      // if this is the first element
      if(first == NULL){
      first = prev;
      }
      last = root;
      }
      prev = root;
      inorder(root->right);
      }
      void recoverTree(TreeNode* root) {
      prev = first = middle = last = NULL;
      inorder(root);

      swap(first->val,last->val);

      }
      };

  • @abhaykumarsingh3884
    @abhaykumarsingh3884 Місяць тому

    Don't use middle pointer just 2nd one if found
    /**
    * Definition for a binary tree node.
    * public class TreeNode {
    * int val;
    * TreeNode left;
    * TreeNode right;
    * TreeNode() {}
    * TreeNode(int val) { this.val = val; }
    * TreeNode(int val, TreeNode left, TreeNode right) {
    * this.val = val;
    * this.left = left;
    * this.right = right;
    * }
    * }
    */
    class Solution {
    TreeNode ptr1=null;
    TreeNode ptr2=null;
    TreeNode prev=null;
    public void getAns(TreeNode root){
    if(root==null){
    return;
    }
    getAns(root.left);
    if(prev != null && root.val< prev.val){
    if(ptr1==null){
    ptr1 =prev;
    ptr2=root;
    }
    else{
    ptr2=root;
    }
    }
    prev=root;
    getAns(root.right);
    }
    public void recoverTree(TreeNode root) {
    getAns(root);
    int temp=ptr1.val;
    ptr1.val=ptr2.val;
    ptr2.val=temp;
    }
    }

  • @adarshkumargupta.
    @adarshkumargupta. 2 роки тому +1

    bhai code bahut tej explain karte ho thoda slow karo yaar

  • @harshitjaiswal9439
    @harshitjaiswal9439 8 місяців тому

    understood.

  • @fazilshafi8083
    @fazilshafi8083 2 місяці тому

    Java Solution 👇
    class Solution {
    private TreeNode firstViolation = null;
    private TreeNode adjacentToViolation = null;
    private TreeNode secondViolation = null;
    private TreeNode prev = null;
    private void swap(TreeNode a, TreeNode b) {
    int temp = a.val;
    a.val = b.val;
    b.val = temp;
    }
    private void helper(TreeNode root) {
    if (root == null) {
    return;
    }
    // Traverse the left subtree
    helper(root.left);
    // Check for violations
    if (prev != null && root.val < prev.val) {
    if (firstViolation == null) {
    firstViolation = prev;
    adjacentToViolation = root;
    } else {
    secondViolation = root;
    }
    }
    // Update prev to current node
    prev = root;
    // Traverse the right subtree
    helper(root.right);
    }
    public void recoverTree(TreeNode root) {
    helper(root);
    if (secondViolation == null) {
    swap(firstViolation, adjacentToViolation);
    } else {
    swap(firstViolation, secondViolation);
    }
    }
    }

  • @silicon9794
    @silicon9794 2 роки тому

    Perfectly explained....

  • @papayasprout
    @papayasprout 2 роки тому

    Thanks for the video man.

  • @anumoynandy5811
    @anumoynandy5811 2 роки тому +4

    Check out Morris Inorder traversal code related to these problem
    class Solution {
    public:
    void recoverTree(TreeNode* root) {

    if(!root){
    return;
    }

    TreeNode*cand1=NULL;

    TreeNode*cand2=NULL;

    TreeNode*prev=NULL;

    TreeNode*curr=root;

    while(curr){

    if(curr->left==NULL){

    if(prev){

    if(prev->val > curr->val){

    if(cand1==NULL){
    cand1=prev;
    }

    cand2=curr;

    }

    }

    prev=curr;

    curr=curr->right;

    }

    else{

    TreeNode*temp=curr->left;

    while(temp && temp->right && temp->right!=curr){
    temp=temp->right;

    }

    if(temp->right==NULL){

    temp->right=curr;

    curr=curr->left;

    }

    else{

    if(prev){
    if(prev->val > curr->val){
    if(cand1==NULL){
    cand1=prev;
    }
    cand2=curr;
    }
    }
    prev=curr;

    temp->right=NULL;

    curr=curr->right;

    }

    }

    }

    swap(cand1->val,cand2->val);

    }
    };

  • @sksp9028
    @sksp9028 Рік тому

    ```
    class Solution {
    private:
    TreeNode *first;
    TreeNode *last;
    TreeNode *prev;
    void inorder(TreeNode* root){
    if(root==NULL) return;
    inorder(root->left);
    if(prev->val>root->val){
    if(first==NULL){
    first=prev;
    last=root;
    }
    else{
    last=root;
    }
    }
    prev=root;
    inorder(root->right);
    }
    public:
    void recoverTree(TreeNode* root) {
    first=last=prev=NULL;
    prev=new TreeNode(INT_MIN);
    inorder(root);
    swap(first->val,last->val);
    }
    };
    ```

  • @ashishkumaryadav5252
    @ashishkumaryadav5252 Рік тому +1

    Exceptional.

  • @harshyallewar5876
    @harshyallewar5876 2 роки тому +1

    Great explain

  • @girikgarg1268
    @girikgarg1268 2 роки тому

    Is it not possible that there are more than two violations for example three or four violations? Why have we considered that either there will be one violation or two violations?

    • @RaunakKumar-yr3zv
      @RaunakKumar-yr3zv 2 роки тому +10

      Because the question states that only 2 nodes will be swapped

  • @charchitagarwal589
    @charchitagarwal589 4 місяці тому

    hey guys'

  • @AnkitPandey-s9h
    @AnkitPandey-s9h Рік тому

    bhaiya you are great

  • @dhairyashiil
    @dhairyashiil 2 роки тому

    Thank You : )

  • @shivambajpeyi9008
    @shivambajpeyi9008 2 роки тому

    this was smooth!

  • @vibhu613
    @vibhu613 2 роки тому +1

    Hey interviewer😆😅

  • @rishabhgupta9846
    @rishabhgupta9846 Рік тому

    understood

  • @Anonymous-uj3jx
    @Anonymous-uj3jx 2 роки тому

    Understood thanks :)

  • @abhiimali
    @abhiimali 2 роки тому

    nice code explanation

  • @jaiminsolanki5478
    @jaiminsolanki5478 2 роки тому

    Understood!

  • @ankitkumarsingh8346
    @ankitkumarsingh8346 2 роки тому

    striver rescued me here

  • @rohanmadiratta6421
    @rohanmadiratta6421 8 місяців тому

    shouldnt first be equal to root..how come first is set equal to prev

  • @girikgarg8
    @girikgarg8 Рік тому

    Done!!

  • @techmoon_
    @techmoon_ 2 роки тому

    Great video

  • @dreamyme543
    @dreamyme543 2 роки тому

    Understood:)

  • @amitswami3139
    @amitswami3139 2 роки тому

    Can I do it using the concept which you are using in the last lecture (largest bst) when the condition get wrong
    largest of left

  • @rks3522
    @rks3522 2 роки тому

    13:10

  • @ajayypalsingh
    @ajayypalsingh 2 роки тому

    💚

  • @harshdasila6680
    @harshdasila6680 Рік тому

    Goat 🐐

  • @audiobooksforyouspark
    @audiobooksforyouspark 2 роки тому

    Wow

  • @KaushikSharma-c3q
    @KaushikSharma-c3q 10 місяців тому

    ...............

  • @yatri6329
    @yatri6329 Рік тому

    Baak bakwas krta h Khali kuch sahi se explain nhi krta h