Flatten Binary Tree to Linked List - Leetcode 114 - Python

  Рет қаралды 49,565

NeetCode

NeetCode

Күн бұрын

Пікірлер: 66
@NeetCode
@NeetCode 3 жыл бұрын
🌲 TREE PLAYLIST: kzbin.info/www/bejne/hZ-2n2WOerZng7s
@srinadhp
@srinadhp 3 жыл бұрын
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!!
@jonaskhanwald566
@jonaskhanwald566 3 жыл бұрын
Unbelievable sir. How are you still solving these problems.
@watchlistsclips3196
@watchlistsclips3196 3 жыл бұрын
@@jonaskhanwald566 Heyy how is martha???
@aryanmaniyar3475
@aryanmaniyar3475 Жыл бұрын
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 :)
@shivampatel8928
@shivampatel8928 3 жыл бұрын
One of the best programming channels on KZbin.. Hands down please keep doing this
@akhilrajnambiar2080
@akhilrajnambiar2080 3 жыл бұрын
Blessed are we to have such a channel, for helping us. Please do keep doing the amazing work!!
@yaadata
@yaadata 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
@sirmidor
@sirmidor 2 жыл бұрын
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
@pranav_bb4231
@pranav_bb4231 3 ай бұрын
very simple and easy to understand, i usually search for simple ways so I do not forget the approach to the solution and the video was making it a bit complicated, thanks for this solution
@sidazhong2019
@sidazhong2019 Жыл бұрын
"Return rightTail or leftTail or root" is too hard to understand. It's not simply like the question wants us to return the tail.
@tomislam
@tomislam Жыл бұрын
Timestamp 13:05 - 13:06: Discord notification alert. :)
@Arkham_nine
@Arkham_nine 2 жыл бұрын
Thanks! What about "Follow up: Can you flatten the tree in-place (with O(1) extra space)?"
@spikygoldfish
@spikygoldfish 5 ай бұрын
The solution in this video uses O(1) memory, so the answer is "yes"
@asian1599
@asian1599 2 ай бұрын
@@spikygoldfish it's not O(1) memory because it uses recursion
@thepriestofvaranasi
@thepriestofvaranasi Ай бұрын
​@@spikygoldfishit takes O(n) space in the worst case (let's say a skewed tree).
@fanifyeyev
@fanifyeyev 3 жыл бұрын
best channel, anytime I need good explanation, NeetCode is very helpful
@osiris1102
@osiris1102 3 жыл бұрын
I am your big fan, but please make more videos on dynamic programming as it's one of the most confusing topic. Thanks.
@ayoubalem865
@ayoubalem865 3 жыл бұрын
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
@ArdianUmam
@ArdianUmam 2 ай бұрын
Share to you another solution that may be easier to understand: processing from the "bottom-right" to the "top-left" in the flattened tree class Solution: def flatten(self, root: Optional[TreeNode]) -> None: """ Do not return anything, modify root in-place instead. """ prev = None def helper(current): # process right-left-root order, i.e: processing from the back (button-right to top-left) # so, the previously processed node (prev) is actually the "right node" of "current node" nonlocal prev if current is None:# basis return else: helper(current.right) helper(current.left) current.right = prev current.left = None prev = current helper(root)
@closingtheloop2593
@closingtheloop2593 8 ай бұрын
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.
@susquon
@susquon Жыл бұрын
This was tough for me to solve on my own. It makes so much sense now thank you!
@zehuazhou3390
@zehuazhou3390 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 9 ай бұрын
+1 the follow up is confusing :(
@numberonep5404
@numberonep5404 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
@light2929
@light2929 2 жыл бұрын
Isn't it O(n*h) solution 🤔
@numberonep5404
@numberonep5404 2 жыл бұрын
@@light2929 nope
@starsky9832
@starsky9832 11 ай бұрын
This is very clever, thanks
@sanandmath4127
@sanandmath4127 7 ай бұрын
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
@muhammadmustafa3158
@muhammadmustafa3158 3 жыл бұрын
Best tutorials on youtube by far !!!!
@victoriatfarrell
@victoriatfarrell Ай бұрын
To solve in O(1) space you would have to do Morris traversal, allegedly. I don't think any of us are busting that out in an interview, though
@ShivangiSingh-wc3gk
@ShivangiSingh-wc3gk 2 жыл бұрын
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 2 жыл бұрын
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 Жыл бұрын
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
@henrydi800
@henrydi800 2 жыл бұрын
what are the values that returned from leftTrail=dfs(root.left) and rightTrial=dfs(root.right)?
@prafulparashar9849
@prafulparashar9849 2 жыл бұрын
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) ```
@utkarshsharma1550
@utkarshsharma1550 3 жыл бұрын
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?
@euphyyu2417
@euphyyu2417 2 ай бұрын
but this is not constant space right? The implementation of the recursion is implicit stack which would be O(n)
@willdazns
@willdazns 3 жыл бұрын
Thanks!
@ISHSACHDEVA-i9r
@ISHSACHDEVA-i9r 2 ай бұрын
Gareeb
@utkarshsinh1919
@utkarshsinh1919 Жыл бұрын
Why we have to return the list tail?
@ganapathinaik5446
@ganapathinaik5446 2 жыл бұрын
Very clear explanation. Thank you :)
@Emorinken
@Emorinken Ай бұрын
Thank you very much man
@jesussepulveda9992
@jesussepulveda9992 3 жыл бұрын
Thank you all your videos are very usefull
@jkk23-g7c
@jkk23-g7c Жыл бұрын
This question is one of those that after watching the video 3 times, I'm still confused
@qsvui
@qsvui 3 ай бұрын
did anyone else hear a discord sound?
@edwardteach2
@edwardteach2 3 жыл бұрын
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)
@ShivangiSingh-wc3gk
@ShivangiSingh-wc3gk 2 жыл бұрын
Does this work?
@DJSTEVE42
@DJSTEVE42 2 жыл бұрын
You're right, thanks for the updated solution, it works
@Arizala213
@Arizala213 2 жыл бұрын
Very helpful, thank you!
@tabmax22
@tabmax22 2 жыл бұрын
no need for a helper function, can just write the same logic inside flatten :)
@anotheraleks
@anotheraleks Жыл бұрын
he said that the only reason for helper was that the flatten func is hinted to return None
@saisumanth7389
@saisumanth7389 8 ай бұрын
But isn't it post order traversal?
@JyotiprakashMandal-bp8ng
@JyotiprakashMandal-bp8ng 7 ай бұрын
Love you
@jonaskhanwald566
@jonaskhanwald566 3 жыл бұрын
Beautiful
@rajendarsingh9333
@rajendarsingh9333 3 жыл бұрын
please make video of sudoku solver
@yaadata
@yaadata 3 жыл бұрын
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
@danieleboch3224
@danieleboch3224 2 жыл бұрын
what's "next" attribute? we do not have such in the TreeNode class
@anonymous-404
@anonymous-404 2 жыл бұрын
watch it again!
@ruthviks
@ruthviks Жыл бұрын
Problem before seeing Neetcode: Wth is this?! Problem after seeing Neetcode: Oh. Such a simple problem!
@aayushpagare9366
@aayushpagare9366 Жыл бұрын
is neetcode real ?
@sarkersaadahmed
@sarkersaadahmed Жыл бұрын
could oyu explain it again
@CANIHAZURDREAMSPLS
@CANIHAZURDREAMSPLS 2 жыл бұрын
discord msg
@codetrooper9279
@codetrooper9279 7 ай бұрын
Explanation was BULLSHIT
@RahulJain-ye4gz
@RahulJain-ye4gz 5 ай бұрын
""" 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 2 жыл бұрын
Thanks!
L38. Flatten a Binary Tree to Linked List | 3 Approaches | C++ | Java
21:51
Binary Tree Maximum Path Sum - DFS - Leetcode 124 - Python
15:19
За кого болели?😂
00:18
МЯТНАЯ ФАНТА
Рет қаралды 3,2 МЛН
Design Linked List - Leetcode 707 - Python
13:50
NeetCodeIO
Рет қаралды 30 М.
Premature Optimization
12:39
CodeAesthetic
Рет қаралды 835 М.
Koko Eating Bananas - Binary Search - Leetcode 875 - Python
15:12
N-Queens - Backtracking - Leetcode 51 - Python
17:51
NeetCode
Рет қаралды 180 М.
3 Types of Algorithms Every Programmer Needs to Know
13:12
ForrestKnight
Рет қаралды 501 М.
Binary Search Tree Iterator - Leetcode 173 - Python
12:47
NeetCode
Рет қаралды 43 М.