• 边工作边刷题:70天一遍leetcode: day 76


    Count Univalue Subtrees

    要点:检测条件比较有意思:因为可能的情况比较多,只要违反了任意一条就return False,所以可以只考虑False的情况,最后return True。
    https://repl.it/CoqQ

    • 错误点:这题类似Largest BST Subtree(with all descendants,bottom up方法,or post order),左子树不符合只能invalidate root,但仍然要recurse到右子树,所以不能提前返回,而是要在右子树访问完以后返回。

    post-order iteration: 注意必须要用map记录,因为post-order没法从栈中获得当前结点左/右子树的情况,所以只能用map记录
    https://repl.it/CopV

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def countUnivalSubtrees(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            def helper(root):
                isUnival = True
                if root.left and (not helper(root.left) or root.val!=root.left.val):
                    isUnival = False
                    
                if root.right and (not helper(root.right) or root.val!=root.right.val):
                    isUnival = False
                
                if not isUnival:
                    return False
                #print root.val
                self.count+=1
                return True
            
            self.count=0
            if not root: return 0
            helper(root)
            return self.count        
    
    # Given a binary tree, count the number of uni-value subtrees.
    
    # A Uni-value subtree means all nodes of the subtree have the same value.
    
    # For example:
    # Given binary tree,
    #               5
    #              / 
    #             1   5
    #           /    
    #           5   5   5
    # return 4.
    
    # Hide Tags Tree
    
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def countUnivalSubtrees(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            if not root: return 0
            stk = [root]
            umap = {}
            pre = None
            count = 0
            while stk:
                cur = stk[-1]
                if pre==None or pre.left==cur or pre.right==cur:
                    if cur.left:
                        stk.append(cur.left)
                    elif cur.right:
                        stk.append(cur.right)
                elif cur.left==pre:
                    if cur.right:
                        stk.append(cur.right)
                else:
                    stk.pop()
                    if cur.left and (not umap[cur.left] or cur.left.val!=cur.val):
                        pre = cur
                        umap[cur]=False
                        continue
                    
                    if cur.right and (not umap[cur.right] or cur.right.val!=cur.val):
                        pre = cur
                        umap[cur]=False
                        continue
                    umap[cur]=True
                    count+=1
                pre = cur
            return count
    
  • 相关阅读:
    第二阶段冲刺之站立会议5
    第二阶段冲刺之站立会议4
    第二阶段冲刺之站立会议3
    “加减乘除”使用说明
    第二阶段冲刺之站立会议2
    Kali学得好,监狱蹲到老,最新版Kali 2020
    【Linux】Centos7密码登录失败锁定设置_20200313
    【Linux】如何设置Linux开机 ,默认进入图形界面或命令行界面?
    【Linux】使用 PXE+Kickstart 无人值守批量安装系统
    【Linux】Linux修改openfile和max user processes?
  • 原文地址:https://www.cnblogs.com/absolute/p/5815693.html
Copyright © 2020-2023  润新知