Flatten Binary Tree to Linked List - Leetcode 114 - Python

Sdílet
Vložit
  • čas přidán 26. 07. 2024
  • 🚀 neetcode.io/ - A better way to prepare for Coding Interviews
    🐦 Twitter: / neetcode1
    🥷 Discord: / discord
    🐮 Support the channel: / neetcode
    ⭐ BLIND-75 PLAYLIST: • Two Sum - Leetcode 1 -...
    💡 CODING SOLUTIONS: • Coding Interview Solut...
    💡 DYNAMIC PROGRAMMING PLAYLIST: • House Robber - Leetco...
    🌲 TREE PLAYLIST: • Invert Binary Tree - D...
    💡 GRAPH PLAYLIST: • Course Schedule - Grap...
    💡 BACKTRACKING PLAYLIST: • Word Search - Backtrac...
    💡 LINKED LIST PLAYLIST: • Reverse Linked List - ...
    💡 BINARY SEARCH PLAYLIST: • Binary Search
    📚 STACK PLAYLIST: • Stack Problems
    Problem Link: leetcode.com/problems/flatten...
    0:00 - Read the problem
    1:20 - Drawing Explanation
    6:38 - Coding Explanation
    leetcode 114
    This question was identified as a facebook interview question from here: github.com/xizhengszhang/Leet...
    #facebook #interview #python
    Disclosure: Some of the links above may be affiliate links, from which I may earn a small commission.
  • Věda a technologie

Komentáře • 57

  • @NeetCode
    @NeetCode  Před 2 lety +2

    🌲 TREE PLAYLIST: czcams.com/video/OnSn2XEQ4MY/video.html

  • @srinadhp
    @srinadhp Před 2 lety +41

    You make complicated problems appear so simple and make us guilty on why we could not think of that solution!! Great explanation and code as usual! Thank you!!

  • @shivampatel8928
    @shivampatel8928 Před 2 lety +5

    One of the best programming channels on CZcams.. Hands down please keep doing this

  • @yaadata
    @yaadata Před 2 lety +3

    I just did this the other day [Wanted to try one that wasn't on your playlist yet] ! Man you are fast though, it took me 15 minutes to even come up with the appropriate strategy. Keep it up. My favorite channel

  • @akhilrajnambiar2080
    @akhilrajnambiar2080 Před 2 lety +8

    Blessed are we to have such a channel, for helping us. Please do keep doing the amazing work!!

  • @aryanmaniyar3475
    @aryanmaniyar3475 Před 9 měsíci

    I was struggling so hard, because out of all the videos I watched for this question, everyone seemed to use a very vague recursive logic without much intuition of the logic behind it. The way you told to write the recursive calls, the way you handled edge cases, I was able to understand it so clearly, that I was able to code your solution without seeing, as well as modify my own code which gave wrong answer while submitting three times, to work correctly for the fourth time!!! Thank you so very much :)

  • @fanifyeyev
    @fanifyeyev Před 2 lety +2

    best channel, anytime I need good explanation, NeetCode is very helpful

  • @susquon
    @susquon Před 10 měsíci

    This was tough for me to solve on my own. It makes so much sense now thank you!

  • @Arkham_nine
    @Arkham_nine Před 2 lety +7

    Thanks! What about "Follow up: Can you flatten the tree in-place (with O(1) extra space)?"

    • @spikygoldfish
      @spikygoldfish Před měsícem

      The solution in this video uses O(1) memory, so the answer is "yes"

  • @muhammadmustafa3158
    @muhammadmustafa3158 Před 2 lety

    Best tutorials on youtube by far !!!!

  • @ganapathinaik5446
    @ganapathinaik5446 Před 2 lety

    Very clear explanation. Thank you :)

  • @Arizala213
    @Arizala213 Před 2 lety

    Very helpful, thank you!

  • @jesussepulveda9992
    @jesussepulveda9992 Před 2 lety

    Thank you all your videos are very usefull

  • @osiris1102
    @osiris1102 Před 2 lety +2

    I am your big fan, but please make more videos on dynamic programming as it's one of the most confusing topic. Thanks.

  • @willdazns
    @willdazns Před 2 lety +3

    Thanks!

  • @sidazhong2019
    @sidazhong2019 Před 10 měsíci +2

    "Return rightTail or leftTail or root" is too hard to understand. It's not simply like the question wants us to return the tail.

  • @sirmidor
    @sirmidor Před rokem

    Keeping track of the order while recursing seemed difficult to me, so I solved it using a deque instead, using the intuition that preorder traversal is essentially popping from the left and appending potential child nodes back to the left of the deque:
    class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
    """
    Do not return anything, modify root in-place instead.
    """
    q = deque()
    q.append(root)
    q.append(None)
    while q[0] is not None:
    node = q.popleft()
    if node.right:
    q.appendleft(node.right)
    if node.left:
    q.appendleft(node.left)

    node.left = None
    node.right = q[0]
    return root

  • @ayoubalem865
    @ayoubalem865 Před 2 lety +1

    keep going , everyday i wait for you to post a video and go try it before returning to watch your explanation, and sometimes my solution looks the same like yours :
    def flatten(self, root: Optional[TreeNode]) -> None:
    """
    Do not return anything, modify root in-place instead.
    """
    self.dfs(root)
    def dfs(self, root):
    if not root:
    return

    if not (root.left or root.right):
    print(root.val)
    return root

    r, l = self.dfs(root.right), self.dfs(root.left)

    if root.left:
    l.right = root.right
    root.right = root.left
    root.left = None

    last = r if r else l
    return last

  • @closingtheloop2593
    @closingtheloop2593 Před 3 měsíci

    Brute force is almost same complexity. DFS and add node pointer to list. Then iterate list and point list[n].right = list[n+1] and list[n].left = NULL. O(n) time and space. Simple af.

  • @tomislam
    @tomislam Před 10 měsíci +1

    Timestamp 13:05 - 13:06: Discord notification alert. :)

  • @henrydi800
    @henrydi800 Před 2 lety

    what are the values that returned from leftTrail=dfs(root.left) and rightTrial=dfs(root.right)?

  • @zehuazhou3390
    @zehuazhou3390 Před 2 lety +3

    Follow up: Can you flatten the tree in-place (with O(1) extra space)? I saw that follow up. If I use O(1) extra space then I have to move the right subtree under the right most position of the left subtree to avoid extra O(h) storage. But if I do that, the running time would be O(nlog(n)). Anyone has any better ideas?

    • @david-nb5ug
      @david-nb5ug Před 5 měsíci

      +1 the follow up is confusing :(

  • @sanandmath4127
    @sanandmath4127 Před 3 měsíci

    Excellent explanation!
    I have a follow up question on this.
    Given the flattened LinkedList as arrived in this solution, can we traverse this flattened LinkedList and reconstruct the original Binary Tree? Thanks

  • @utkarshsharma1550
    @utkarshsharma1550 Před 2 lety +1

    Your code is returning the pointer to Node: 6 if we take the example given in the question. Shouldn't it return the pointer to Node: 1. In short why are we returning the pointer to the tail?

  • @jonaskhanwald566
    @jonaskhanwald566 Před 2 lety

    Beautiful

  • @ShivangiSingh-wc3gk
    @ShivangiSingh-wc3gk Před 2 lety

    I have a few questions:
    1) when doing the swapping:
    I thought of something like this
    root.left= None
    leftTail.right = rightTail
    root.right = leftTail.
    Why are we using the root and not the tails.

    • @thecuriousengineer
      @thecuriousengineer Před 2 lety

      Because at each node we simply get a tail value from left branch.
      The tail value order is (rightTail, leftTail or root).
      At root (1)
      leftTail is (4)
      rightTail is (6)
      leftTail.right = root.right
      4 -> 5
      root.right = root.left
      1 -> 2
      root.left = None
      1
      / \
      NULL 2
      \
      4
      \
      5
      Try solving it on paper and you'll see it :)

    • @sidazhong2019
      @sidazhong2019 Před 10 měsíci

      leftTail.right = rightTail is wrong. rightTail is just a single node. root.right is the sub tree. root,right is a tree, rightTail is a node

  • @utkarshsinh1919
    @utkarshsinh1919 Před rokem

    Why we have to return the list tail?

  • @prafulparashar9849
    @prafulparashar9849 Před 2 lety

    Great explanation:
    Here i tried this question by traversing the right most subtree first -- I found it a little more easier to understand.
    ```
    class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
    """
    Do not return anything, modify root in-place instead.
    """
    self.temp = None
    def helper(root):
    if not root:
    return
    helper(root.right)
    helper(root.left)
    root.right = self.temp
    root.left = None
    self.temp = root
    helper(root)
    ```

  • @JyotiprakashMandal-bp8ng
    @JyotiprakashMandal-bp8ng Před 3 měsíci

    Love you

  • @rajendarsingh9333
    @rajendarsingh9333 Před 2 lety

    please make video of sudoku solver

    • @yaadata
      @yaadata Před 2 lety

      For the sudoku solver just use 3 hashsets (One for the row, one for the column, one for the section of the board). The tricky part is for the section is a math equation to turn row and column number to section number (think section=m*row + column). Traverse the game board and check that no duplicates are in your hashsets. Time O(m*n), Space Complexity O(m*n) where m = number of rows, n=number of columns

  • @tabmax22
    @tabmax22 Před rokem

    no need for a helper function, can just write the same logic inside flatten :)

    • @anotheraleks
      @anotheraleks Před rokem

      he said that the only reason for helper was that the flatten func is hinted to return None

  • @ruthviks
    @ruthviks Před 10 měsíci +1

    Problem before seeing Neetcode: Wth is this?!
    Problem after seeing Neetcode: Oh. Such a simple problem!

  • @edwardteach2
    @edwardteach2 Před 2 lety +1

    U a God. I had a different condition in the if root.left condition. The code in the video doesn't work anymore.
    class Solution(object):
    def flatten(self, root):
    """
    :type root: TreeNode
    :rtype: None Do not return anything, modify root in-place instead.
    """
    def dfs(root):
    if not root:
    return root
    left_node = dfs(root.left)
    right_node = dfs(root.right)
    if root.left:
    root.left = None
    root.right = left_node
    while left_node.right:
    left_node = left_node.right
    left_node.right = right_node
    return root
    dfs(root)

  • @saisumanth7389
    @saisumanth7389 Před 4 měsíci

    But isn't it post order traversal?

  • @jkk23-g7c
    @jkk23-g7c Před 9 měsíci

    This question is one of those that after watching the video 3 times, I'm still confused

  • @numberonep5404
    @numberonep5404 Před 2 lety +2

    A somewhat different solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
    if root:
    # We keep track of the pointers to the left and the right subtrees
    left = root.left
    right = root.right
    # We cut the link between the root and the left and right subtrees for independance
    root.left = None
    root.right = None
    # We flatten each subtree
    self.flatten(left)
    self.flatten(right)
    # We reattach the first part to the root, meaning the left part since it is a pre-order thingy
    root.right = left
    # We also need to reattach the flattened right subtree to the end of left subtree
    prev, current = root, left
    while current is not None:
    prev = current
    current = current.right
    prev.right = right

  • @KylianMbappe07303
    @KylianMbappe07303 Před rokem

    could oyu explain it again

  • @CANIHAZURDREAMSPLS
    @CANIHAZURDREAMSPLS Před rokem +1

    discord msg

  • @danieleboch3224
    @danieleboch3224 Před 2 lety

    what's "next" attribute? we do not have such in the TreeNode class

  • @aayushpagare9366
    @aayushpagare9366 Před 8 měsíci

    is neetcode real ?

  • @codetrooper9279
    @codetrooper9279 Před 2 měsíci +1

    Explanation was BULLSHIT

  • @RahulJain-ye4gz
    @RahulJain-ye4gz Před měsícem

    """
    1
    / \
    2 5
    / \ \
    3 4 6
    Step 1: Flatten the left subtree of 1
    Call: dfs(1)
    Call: dfs(2)
    Call: dfs(3)
    root.left and root.right are None
    Return 3 (last node in the left subtree of 2)
    Call: dfs(4)
    root.left and root.right are None
    Return 4 (last node in the right subtree of 2)
    leftTail = 3, rightTail = 4
    Set 3.right = 4
    Set 2.right = 3, 2.left = None
    Return 4 (last node in the flattened subtree of 2)
    Step 2: Flatten the right subtree of 1
    Call: dfs(5)
    Call: dfs(None)
    Return None
    Call: dfs(6)
    root.left and root.right are None
    Return 6 (last node in the right subtree of 5)
    leftTail = None, rightTail = 6
    Return 6 (last node in the flattened subtree of 5)
    Step 3: Combine left and right subtrees of 1
    leftTail = 4, rightTail = 6
    Set 4.right = 5
    Set 1.right = 2, 1.left = None
    Return 6 (last node in the flattened tree)
    """

  • @andreytamelo1183
    @andreytamelo1183 Před 2 lety +1

    Thanks!