当前位置: 首页 > 知识库问答 >
问题:

计算好节点的数量

皮景龙
2023-03-14

问题陈述

我无法理解我的代码出了什么问题,也很难理解下面的约束。

我的伪代码:

  1. 遍历树级别顺序并构造数组表示(输入实际上作为单个根给出,但它们使用数组表示来显示完整的树)
  2. 循环访问此数组表示形式,跳过空节点
  3. 对于每个节点,让我们称之为X,向上迭代,直到我们到达根检查,看看是否在路径中的任何一点,parentNode

限制条件:

  • 二叉树中的节点数在[1,10^5]范围内。
  • 每个节点的值在[-10^4,10^4]之间

首先:我对约束的困惑是,自动测试会给出输入,如<code>2,4,4,null,1,3,null,null,5,null,null,null,null,5,4,4〕

其次:对于上面的输入,我的代码输出8,期望值是6,但是当我从数组中绘制树时,我也认为答案应该是8!

输入树

# 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:
        
        
        arrRepresentation = []
        
        queue = []
        
        queue.append(root)
        
        # while queue not empty
        while queue:
            # remove node
            node = queue.pop(0)
            if node is None:
                arrRepresentation.append(None)
                
            else:
                arrRepresentation.append(node.val)

            
          
            if node is not None:
                # add left to queue
                queue.append(node.left)

                # add right to queue
                queue.append(node.right)
            
        
        print(arrRepresentation)
        goodNodeCounter = 1

                
        # iterate over array representation of binary tree
        for k in range(len(arrRepresentation)-1, 0, -1):
            child = arrRepresentation[k]
            if child is None:
                continue
            isGoodNode = self._isGoodNode(k, arrRepresentation)
            print('is good: ' + str(isGoodNode))

            if isGoodNode:
                goodNodeCounter += 1
                
           
                
            
        
        return goodNodeCounter

        
    def _isGoodNode(self, k, arrRepresentation):
        
        child = arrRepresentation[k]
        print('child: '+str(child))
        # calculate index of parent
        parentIndex = (k-1)//2
        
        isGood = True
        # if we have not reached root node
        while parentIndex >= 0:
            parent = arrRepresentation[parentIndex]
            print('parent: '+ str(parent))
            # calculate index of parent
            parentIndex = (parentIndex-1)//2
            
            if parent is None:
                continue
            
            if parent > child:
                isGood = False
                break
                
           
                
        return isGood
        
        
        

共有3个答案

公冶嘉
2023-03-14

您提供的二进制堆对应于后续层次结构:

tree = [2,4,4,4,None,1,3,None,None,5,None,None,None,None,5,4,4]
printHeapTree(tree)

    2
   / \
  4   4
 /   / \
4   1   3
         \
          5

在该树中,只有项值<code>1

请注意,列表中有一些值是不可访问的,因为它们的父级为null(无),因此它们不是树的一部分(但这可能是复制/粘贴错误)。如果我们用其他东西替换这些无值以使它们成为树的一部分,我们可以看到不可访问节点在层次结构中的位置:

t = [2,4,4,4,'*', 1,3,'*',None, 5,None, None,None,None,5,4,4]
printHeapTree(t)

          2
       __/ \_
      4      4
     / \    / \
    4   *  1   3
   /   /        \
  *   5          5
 / \
4   4

这可能是结果8(不将根视为好)与结果6(将根视为好)之间的差异的来源。

您可以在此处找到printHeapTree()函数

陆甫
2023-03-14

既然你想用广度优先搜索来解决:

from collections import deque

class Solution:
    def goodNodes(self,root:TreeNode)->int:
        if not root:
            return 0        
        queue=deque()
        # run bfs  with track of max_val till its parent node
        queue.append((root,-inf))
        res=0
        while queue:
            current,max_val=queue.popleft()
            if current.val>=max_val:
                res+=1
            if current.left:   
                queue.append((current.left,max(max_val,current.val)))
            
            if current.right:
                queue.append((current.right,max(max_val,current.val)))           
        return res

我将节点及其max_value添加到它的父节点。我不能添加全局max_value,因为看看这棵树:

对于前3个节点,您将拥有这个[3,1,4],如果您在全局范围内保持max_val,max_val将是4。

下一个节点是3,左边的叶子节点。因为max_node是4,3

习狐若
2023-03-14

递归可能更容易:

class Node:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def good_nodes(root, maximum=float('-inf')):
    if not root: # null-root
        return 0

    is_this_good = maximum <= root.val # is this root a good node?

    maximum = max(maximum, root.val) # update max
    good_from_left = good_nodes(root.left, maximum) if root.left else 0
    good_from_right = good_nodes(root.right, maximum) if root.right else 0

    return is_this_good + good_from_left + good_from_right

tree = Node(2, Node(4, Node(4)), Node(4, Node(1, Node(5, None, Node(5, Node(4), Node(4)))), Node(3)))
print(good_nodes(tree)) # 6

基本上,递归遍历树,同时更新到目前为止看到的最大数量。在每次迭代中,将根的值与最大值进行比较,并在必要时递增计数器。

 类似资料:
  • 计算节点 需要额外启用 l3_agent(dvr 模式),以及 metadata agent。 其实,跟传统情况下的网络节点十分类似。每个东西向路由器有自己的命名空间,负责跨子网的转发。另外,多一个 floating 路由器,专门负责经由 floating 地址的南北向转发。 东西流量 如上图所示,租户两个子网,红色和绿色,分别有 vm1 和 vm2,位于节点 cn1 和 cn2 上。 vm1 访

  • 计算节点 主要包括两个网桥:集成网桥 br-int 和 隧道网桥 br-tun。 $ sudo ovs-vsctl show225f3eb5-6059-4063-99c3-8666915c9c55 Bridge br-int fail_mode: secure Port br-int Interface br-int

  • 计算节点 查看网桥信息,主要包括两个网桥:br-int和br-eth1: [root@Compute ~]# ovs-vsctl showf758a8b8-2fd0-4a47-ab2d-c49d48304f82 Bridge "br-eth1" Port "phy-br-eth1" Interface "phy-br-eth1" Port "

  • 计算节点 以抽象系统架构的图表为例,Compute 节点上包括两台虚拟机 VM1 和 VM2,分别经过一个网桥(如 qbr-XXX)连接到 br-int 网桥上。br-int 网桥再经过 br-tun 网桥(物理网络是 GRE 实现)连接到物理主机外部网络。 对于物理网络通过 vlan 来隔离的情况,则一般会存在一个 br-eth 网桥,替代 br-tun 网桥。 qbr 在 VM1 中,虚拟机的

  • 假设我有一个无向多图,即一个(G,E)对,其中G是一个有限的结点集,E是一个有限的边集。我正在寻找一个算法,将分配一个单一的字符串值到每个节点在以下的约束。 1. 每个节点都被赋予一组约束(可能是空的),这些约束限制了允许的值。我希望至少支持以下类型的值约束: null 有两种类型的边缘: 不同, 相同, 这意味着应该为相关节点分配不同/相同的值(意味着不相等/相等的字符串)。 null 这意味着

  • 假设我们有这样一棵树:http://up400.siz.co.il/up1/tymmh2wylmmo.png 当树的高度为H时,树中的每个级别可以有不同数量的节点。例如,根级别有3个节点(“图片中的x”),下一级别每个节点有2个节点(“图片中的y”),下一级别每个节点有4个节点(“图片中的z”),等等。。。 在给定H和节点数(每个节点)的情况下,有没有计算这类树的公式? 谢谢