L52. Recover BST | Correct BST with two nodes swapped

Поделиться
HTML-код
  • Опубликовано: 5 ноя 2021
  • Entire DSA Course: takeuforward.org/strivers-a2z...
    Check our Website:
    Linkedin/Instagram/Telegram: linktr.ee/takeUforward
    #treeSeries #striver #placements

Комментарии • 120

  • @takeUforward
    @takeUforward  2 года назад +50

    Please like and share :)

  • @AdityaSharma-nr7qn
    @AdityaSharma-nr7qn 2 года назад +68

    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 10 месяцев назад +17

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

  • @jiteshsingh4899
    @jiteshsingh4899 2 года назад +11

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

  • @stith_pragya
    @stith_pragya 7 месяцев назад +1

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

  • @chitranshjain5075
    @chitranshjain5075 2 года назад +2

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

  • @namratam1522
    @namratam1522 Год назад +1

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

  • @shinewanna3959
    @shinewanna3959 Год назад +14

    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 11 месяцев назад +1

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

  • @dhrutidesai278
    @dhrutidesai278 4 месяца назад

    Thankyou sir👍For always helping by your approaches

  • @preetisahani5054
    @preetisahani5054 9 месяцев назад

    Awesome explanation

  • @Ramu9119
    @Ramu9119 6 месяцев назад

    excellent explanation striver bhai

  • @tempbot7190
    @tempbot7190 Месяц назад

    Much Love from London❤

  • @adebisisheriff159
    @adebisisheriff159 5 месяцев назад

    Thanks Man!!!

  • @ujjwalverma5893
    @ujjwalverma5893 2 года назад +10

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

  • @shashankbajpai5659
    @shashankbajpai5659 2 года назад +6

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

  • @amanbhadani8840
    @amanbhadani8840 2 года назад +3

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

  • @user-tk2vg5jt3l
    @user-tk2vg5jt3l 3 месяца назад

    Thank you Bhaiya

  • @ZebraZodiac
    @ZebraZodiac 2 месяца назад +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.

  • @jerrywong5140
    @jerrywong5140 2 года назад +2

    Very helpful and thorough explanation, love it!

  • @krishnaradhey2814
    @krishnaradhey2814 Год назад +4

    LeetCode 99 problem Can be done with morris traversal

  • @SharuxD
    @SharuxD Год назад +1

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

  • @pratikmhatre4815
    @pratikmhatre4815 Год назад +5

    I always feel motivated by your passion of explaining problems👍

  • @timjoyalle318
    @timjoyalle318 2 года назад +3

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

  • @kalpeshmali1476
    @kalpeshmali1476 2 года назад +3

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

  • @DeependraSingh-jh8xf
    @DeependraSingh-jh8xf 10 месяцев назад

    fire hai bhau

  • @ayushbhargava8400
    @ayushbhargava8400 6 месяцев назад

    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.

  • @studyafa7159
    @studyafa7159 5 месяцев назад +1

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

  • @harshitjaiswal9439
    @harshitjaiswal9439 4 месяца назад

    understood.

  • @SatyamKumar-bw4vi
    @SatyamKumar-bw4vi Год назад +4

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

  • @Mathurfrombihar
    @Mathurfrombihar 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);
    }

  • @abhinanda7049
    @abhinanda7049 2 месяца назад

    understood

  • @shagunlamba6481
    @shagunlamba6481 2 года назад +2

    Great explanation , thank you.

  • @gandhijainamgunvantkumar6783
    @gandhijainamgunvantkumar6783 2 года назад

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

  • @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.

  • @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

      You seem to like teddy bears a lot

  • @ishakhutafale1163
    @ishakhutafale1163 26 дней назад

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

  • @tusharagarwal5306
    @tusharagarwal5306 4 месяца назад +1

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

  • @sreekanthyadav5801
    @sreekanthyadav5801 Месяц назад

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

  • @keshavagrawal1027
    @keshavagrawal1027 Месяц назад

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

  • @shantanukumar4081
    @shantanukumar4081 2 года назад +1

    Great Explanation !!!

  • @prashantsahu6212
    @prashantsahu6212 2 года назад +2

    Just wow, the intution was awesome.

  • @muditkhanna8164
    @muditkhanna8164 11 месяцев назад

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

  • @sparshsharma6068
    @sparshsharma6068 2 года назад +1

    Amazing explanation bhaiya!

  • @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 ?

  • @JujareVinayak
    @JujareVinayak Год назад

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

  • @vinaygoswami5374
    @vinaygoswami5374 2 года назад

    Quite ambiguous explanation.

  • @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.

  • @anumoynandy5811
    @anumoynandy5811 Год назад +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);

    }
    };

  • @niranjansaha5135
    @niranjansaha5135 Год назад +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);
    }
    }

  • @shivambajpeyi9008
    @shivambajpeyi9008 2 года назад

    this was smooth!

  • @papayasprout
    @papayasprout 2 года назад

    Thanks for the video man.

  • @prasadm3614
    @prasadm3614 Год назад

    Congratulations on 3 Lakh Subscribers

  • @siddhaarthsingh7414
    @siddhaarthsingh7414 2 года назад +1

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

    • @arpitjaswal4210
      @arpitjaswal4210 Год назад

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

  • @lavanyaprakashjampana933
    @lavanyaprakashjampana933 Год назад +1

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

  • @stith_pragya
    @stith_pragya 7 месяцев назад +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 6 месяцев назад +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

  • @spyrowolf2211
    @spyrowolf2211 2 года назад +2

    what drawing software are u using?

  • @charchitagarwal589
    @charchitagarwal589 Месяц назад

    hey guys'

  • @silicon9794
    @silicon9794 Год назад

    Perfectly explained....

  • @harshyallewar5876
    @harshyallewar5876 2 года назад +1

    Great explain

  • @jagjiwanchimkar8106
    @jagjiwanchimkar8106 2 года назад +1

    When this Series Complete

  • @dhairyashiil
    @dhairyashiil 2 года назад

    Thank You : )

  • @justinmyth4980
    @justinmyth4980 2 года назад

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

    • @placementbaadshah8604
      @placementbaadshah8604 2 года назад

      ruclips.net/video/k2haMtP7nvs/видео.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

  • @jaiminsolanki5478
    @jaiminsolanki5478 2 года назад

    Understood!

  • @Anonymous-uj3jx
    @Anonymous-uj3jx 2 года назад

    Understood thanks :)

  • @16aniketdutta58
    @16aniketdutta58 2 года назад +1

    The middle pointer can be avoided I guess!!!

    • @placementbaadshah8604
      @placementbaadshah8604 2 года назад

      ruclips.net/video/k2haMtP7nvs/видео.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);

      }
      };

  • @arsilvyfish11
    @arsilvyfish11 11 месяцев назад

    Excellent explanation

  • @ashishkumaryadav5252
    @ashishkumaryadav5252 Год назад +1

    Exceptional.

  • @ErfanHossainShoaib
    @ErfanHossainShoaib Год назад

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

  • @rounakmukherjee9540
    @rounakmukherjee9540 Год назад

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

  • @UECAshutoshKumar
    @UECAshutoshKumar 11 месяцев назад +1

    Thank you sir

  • @abhiimali
    @abhiimali 2 года назад

    nice code explanation

  • @techmoon_
    @techmoon_ 2 года назад

    Great video

  • @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

  • @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;
    }
    }

  • @adarshkumargupta.
    @adarshkumargupta. Год назад +1

    bhai code bahut tej explain karte ho thoda slow karo yaar

  • @gauravshukla5203
    @gauravshukla5203 11 месяцев назад

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

  • @girikgarg8
    @girikgarg8 Год назад

    Done!!

  • @dreamyme543
    @dreamyme543 Год назад

    Understood:)

  • @user-gq3xu4vj8d
    @user-gq3xu4vj8d Год назад

    bhaiya you are great

  • @vibhu613
    @vibhu613 2 года назад +1

    Hey interviewer😆😅

  • @audiobooksforyouspark
    @audiobooksforyouspark 2 года назад

    Wow

  • @ankitkumarsingh8346
    @ankitkumarsingh8346 2 года назад

    striver rescued me here

  • @jayyy311
    @jayyy311 2 года назад

    💚

  • @ankurshukla6462
    @ankurshukla6462 2 года назад +2

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

  • @rks3522
    @rks3522 2 года назад

    13:10

  • @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);

      }
      };

  • @sksp9028
    @sksp9028 11 месяцев назад

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

  • @harshdasila6680
    @harshdasila6680 11 месяцев назад

    Goat 🐐

  • @rohanmadiratta6421
    @rohanmadiratta6421 5 месяцев назад

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

  • @user-up6sl2gq8p
    @user-up6sl2gq8p 7 месяцев назад

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

  • @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

  • @yatri6329
    @yatri6329 Год назад

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

  • @satyamchauhan9775
    @satyamchauhan9775 2 года назад

    I have done it in n time and n space using hashmap , and i was thinking my solution is best until i watched this video🥲

  • @kakarotsv50
    @kakarotsv50 8 месяцев назад

    Awesome explanation

  • @chiragbansod8252
    @chiragbansod8252 4 месяца назад

    understood

  • @jagjiwanchimkar8106
    @jagjiwanchimkar8106 2 года назад +2

    When this Serie Complete

  • @rishabhgupta9846
    @rishabhgupta9846 Год назад

    understood