Microsoft's Most Asked Question 2021 - Count Good Nodes in a Binary Tree - Leetcode 1448 - Python

แชร์
ฝัง
  • เผยแพร่เมื่อ 6 ม.ค. 2025

ความคิดเห็น • 58

  • @NeetCode
    @NeetCode  3 ปีที่แล้ว +4

    🌲 TREE PLAYLIST: th-cam.com/video/OnSn2XEQ4MY/w-d-xo.html

  • @surepasu
    @surepasu 3 ปีที่แล้ว +33

    I cannot thank you enough for your videos . They are crisp and easy to follow. For me , your channel become the one stop for all my learning .Using Python simplified even further.

  • @stylisgames
    @stylisgames 6 หลายเดือนก่อน +8

    I actually got this one without looking at any hints! 🙌Doing all of the previous BST problems beforehand helped greatly.

  • @symbol767
    @symbol767 2 ปีที่แล้ว +12

    Right after you explained the problem in the first 3min I understood it immediately and realized I needed to just keep track of the max value in the current path.
    Looking at your solution, seems I figured it out correctly, thank you man. Liked

    • @nemesis_rc
      @nemesis_rc 5 หลายเดือนก่อน

      How to track max value

    • @nemesis_rc
      @nemesis_rc 5 หลายเดือนก่อน

      btw, where are you from?

  • @kuoyulu6714
    @kuoyulu6714 ปีที่แล้ว +2

    So simple and easy the way you did it! I was using a Set and adding each good node to my set, but counting good node is so much easier the way you did it. Thanks for the vid as always!

  • @chenjus
    @chenjus 3 ปีที่แล้ว +20

    Alternative using nonlocal
    good = 0
    def dfs(node, parent):
    nonlocal good
    if not node: return
    if node.val >= parent:
    good += 1
    max_ = max(parent, node.val)
    dfs(node.left, max_)
    dfs(node.right, max_)
    dfs(root, root.val)
    return good

  • @The6thProgrammer
    @The6thProgrammer ปีที่แล้ว

    Can be done easily with BFS as well. There is also no rule against updating the node values, so I used BFS and every time I added a new node to the queue I updated that nodes value if it was < root->val

  • @piyusharyaprakash4365
    @piyusharyaprakash4365 ปีที่แล้ว

    I did the same, but I used extraspace. Used a array to store the path and update count only if the last element of the array is the max element. It pretty much runs the same!
    class Solution:
    def goodNodes(self, root: TreeNode) -> int:
    count = 0
    def dfs(root,res):
    nonlocal count
    if not root: return res
    res.append(root.val)
    if max(res) == res[-1]: count += 1
    dfs(root.left,res)
    dfs(root.right,res)
    res.pop()
    return res

    dfs(root,[])
    return count

  • @sagarverma868
    @sagarverma868 8 วันที่ผ่านมา

    I think this solution is a bit easier to read.
    class Solution:
    def goodNodes(self, root: TreeNode) -> int:
    self.res = 0
    def dfs(root,maxVal):
    if(root == None):
    return
    if(root.val >= maxVal):
    self.res +=1
    maxVal = max(maxVal, root.val)
    dfs(root.left,maxVal)
    dfs(root.right,maxVal)
    dfs(root,root.val)
    return self.res

  • @neel1901
    @neel1901 9 หลายเดือนก่อน +1

    i performed a level order traversal and was pushing the node's value if it was greater than max value else i was just pushing the max value for both subtrees(if current node value was greater than max) i just incremented the counter

  • @bhailog_gaming_2000
    @bhailog_gaming_2000 3 ปีที่แล้ว +8

    Congratulations on 10k subscribers!!

    • @NeetCode
      @NeetCode  3 ปีที่แล้ว +1

      Thanks!

    • @leeroymlg4692
      @leeroymlg4692 2 ปีที่แล้ว +1

      a year later and he's at almost 300k subscribers

    • @natnaelzewdu4289
      @natnaelzewdu4289 8 หลายเดือนก่อน +1

      and now he is at 699K 😂

  • @abhinaygupta
    @abhinaygupta 3 ปีที่แล้ว +6

    Great explanation. Caught the idea in between just by your explanation. And congratulations on 10 K

    • @TaiChiSWAG
      @TaiChiSWAG ปีที่แล้ว +2

      Its 330K now

    • @hrushik10
      @hrushik10 ปีที่แล้ว

      It’s almost 600K now 🎉

  • @kanishkameta5377
    @kanishkameta5377 6 หลายเดือนก่อน +1

    int helper(TreeNode* root, int prev){
    if(root==NULL)
    return 0;
    if(root->val>=prev)
    return 1+helper(root->right,root->val)+helper(root->left,root->val);
    else
    return helper(root->right,prev)+helper(root->left,prev);
    }
    int goodNodes(TreeNode* root) {
    return helper(root,INT_MIN);
    }
    C++ implementation

  • @RandomShowerThoughts
    @RandomShowerThoughts 4 หลายเดือนก่อน +1

    The solution was easy, tbh I was reading the problem, and at first it sounded like it just wanted the nodes where the value was greater than the root, but that wouldn't really make much sense lol

  • @arpanbanejee5143
    @arpanbanejee5143 3 ปีที่แล้ว +10

    Nice recursive solution, but this can be more intuitive- kind of similar to LCS prob
    class Solution {
    public int goodNodes(TreeNode root) {
    if (root == null) return 0;
    return helper(root,root.val);
    }

    public static int helper(TreeNode root, int max){
    if (root == null) return 0;
    if (root.val >= max){
    return 1 + helper(root.left,Math.max(root.val,max)) + helper(root.right,Math.max(root.val,max));
    } else {
    return helper(root.left,max) + helper(root.right,max);
    }

    }
    }

  • @mostinho7
    @mostinho7 2 ปีที่แล้ว +1

    Done Thanks
    Similar approach to verifying binary tree, doing a “pre-order- traversal and passing max encountered node from root until now to each recursive call

  • @tarunsethi6041
    @tarunsethi6041 ปีที่แล้ว

    If you add 'res' as a parameter of your dfs function, only one stack frame will be used irrespective of how many times dfs is called recursively because of compiler optimization called "tail recursion"

    • @ranvirchhina5179
      @ranvirchhina5179 ปีที่แล้ว

      python doesn't optimize tail recursion

  • @ziontan4402
    @ziontan4402 3 ปีที่แล้ว +1

    Thank you for your video! Well-explained and it's amazing!

  • @IK-xk7ex
    @IK-xk7ex ปีที่แล้ว

    The another one problem I could come up with myself. But as always I watch your videos to find more smart solution

  • @aliciama1745
    @aliciama1745 ปีที่แล้ว +1

    Hi, NeetCode, Just curious, was your website created by using html, css and js, or you created by using website builder? If you build it by using html etc, how long will it take you to finish this? thank you

    • @NeetCode
      @NeetCode  ปีที่แล้ว

      Yeah i built it from scratch, i talk about it in this video: th-cam.com/video/4G5t1HwHQD4/w-d-xo.html

  • @huangCAnerd
    @huangCAnerd 2 ปีที่แล้ว +3

    Why is the space complexity O(logN) or the height of the tree?

    • @clashwidzack7298
      @clashwidzack7298 2 ปีที่แล้ว +1

      because in worst case our function can call max number of function calls that are equal to the height of three. Now at a time tree can grow in only one direction(path) and that path might have max no of nodes among all other paths and since our function has to cover those nodes with the help of function call it will call the those number of nodes

  • @MrACrazyHobo
    @MrACrazyHobo 3 ปีที่แล้ว +5

    I kind of wanted to hear what your neighbors were yelling about lol

    • @bernardoramirez1759
      @bernardoramirez1759 5 หลายเดือนก่อน +3

      “No one solves that under 30 mins”

  • @nikhildinesan5259
    @nikhildinesan5259 3 ปีที่แล้ว

    Kudos on 10k !!!❤️❤️

    • @farazahmed7
      @farazahmed7 2 ปีที่แล้ว

      @Chiamaka Udechukwu 155k now. He's growing like nuts. Fully deserved

  • @shubham900100
    @shubham900100 ปีที่แล้ว +1

    I always feel like if you use nonlocal in helper functions, it'll make your life a ton easier...
    # Definition for a binary tree node.
    # class TreeNode:
    # def __init__(self, val=0, left=None, right=None):
    # self.val = val
    # self.left = left
    # self.right = right
    class Solution:
    def goodNodes(self, root: TreeNode) -> int:
    cnt=0
    def helper(root,max_val):
    nonlocal cnt
    if not root:
    return
    max_val=max(max_val,root.val)
    if root.val>=max_val:
    cnt+=1
    helper(root.left,max_val)
    helper(root.right,max_val)
    helper(root,root.val)
    return cnt

    • @malakggh
      @malakggh ปีที่แล้ว

      yea and you can also do the same using self:
      self.cnt = 0
      then every where inside the helper function use self.cnt = ...

  • @sinister_deamon
    @sinister_deamon 2 ปีที่แล้ว

    wow i am speechless, crazy ! You a god!

  • @KyaAapJaanteHain-g4x
    @KyaAapJaanteHain-g4x 2 ปีที่แล้ว +1

    i am yelling too because its hard to do tree questions with recursion🙃🙃

  • @sirojiddinSoftwareEngineer
    @sirojiddinSoftwareEngineer 3 หลายเดือนก่อน

    Thanks a lot

  • @Emorinken
    @Emorinken 3 หลายเดือนก่อน

    Thanks man

  • @yoyo8293
    @yoyo8293 3 ปีที่แล้ว

    Congrats on 10K !! can you share from where you get the latest questions asked in FAANG

  • @muzaffartursunov324
    @muzaffartursunov324 ปีที่แล้ว

    good job bro!

  • @anatoliy-gr
    @anatoliy-gr 4 หลายเดือนก่อน

    Мир тебе за твой труд!

  • @HyunBinKim-yo9fx
    @HyunBinKim-yo9fx 2 ปีที่แล้ว +1

    Does anyone know why the space complexity is logarithmic?

    • @chaoluncai4300
      @chaoluncai4300 2 ปีที่แล้ว +1

      assume you haven't figure out yet lol, since we are doing dfs, and the max no. of method call frames that can exist on stack is the max(height of tree), which is log(Node)

  • @edwardteach2
    @edwardteach2 3 ปีที่แล้ว

    U a God

  • @JiaTanchun
    @JiaTanchun ปีที่แล้ว

    RecursionError: maximum recursion depth exceeded in comparison

  • @ningzedai9052
    @ningzedai9052 2 ปีที่แล้ว +2

    I think this question should be labeled as "Easy" instead of "Medium" .

    • @JohnTosun
      @JohnTosun ปีที่แล้ว

      It is medium because you can do different approaches with it. If you can do brute force and pass, it could be easy

    • @NihongoWakannai
      @NihongoWakannai ปีที่แล้ว

      Yeah all you have to do to pass it is basically just traverse a tree. There are easy questions which are more complex than this

  • @jonaskhanwald566
    @jonaskhanwald566 3 ปีที่แล้ว

    same code but:
    Runtime: 272 ms, faster than 37.86% of Python3 online submissions for Count Good Nodes in Binary Tree.
    Memory Usage: 33.6 MB, less than 13.16% of Python3 online submissions for Count Good Nodes in Binary Tree.

  • @jonaskhanwald566
    @jonaskhanwald566 3 ปีที่แล้ว +3

    Do both iterative and recursive approaches in future

    • @CEOofTheHood
      @CEOofTheHood 3 ปีที่แล้ว +20

      how about Please Do both iterative and recursive approaches in future. Hes doing you a favor.

  • @alexthezhang
    @alexthezhang 2 ปีที่แล้ว +2

    why it is so easy to you😭

  • @rommeltito123
    @rommeltito123 2 ปีที่แล้ว

    Umm no ...I am not checking interviewing.io ...... I find neetcode better!