Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 尝试过的二叉树示例得到的输出为一个对象,如何将这个对象的值放入一个数组中进行进一步的问题_Javascript_Algorithm_Typescript_Tree_Binary Tree - Fatal编程技术网

Javascript 尝试过的二叉树示例得到的输出为一个对象,如何将这个对象的值放入一个数组中进行进一步的问题

Javascript 尝试过的二叉树示例得到的输出为一个对象,如何将这个对象的值放入一个数组中进行进一步的问题,javascript,algorithm,typescript,tree,binary-tree,Javascript,Algorithm,Typescript,Tree,Binary Tree,问题陈述 您将看到一棵树,其中N个节点的根为1。N个节点中的每个节点都有一些与之相关的特殊编号Se。每个节点也有一定的功率。树的每个节点的功率定义为节点(包括该节点)子树中重节点的数量。重节点是指其特殊数的除数之和为3的倍数的节点。您将收到Q查询 有两种类型的查询: 类型1:更新节点的特殊编号 类型2:告诉某个节点的功率 输入格式 第一行:两个空格分隔的整数N和Q,分别表示树中的节点数和查询数。接下来的N-1行中的每一行:两个空格分隔的整数U和V,表示它们之间有一条边。 下一行:N个空格分隔

问题陈述 您将看到一棵树,其中N个节点的根为1。N个节点中的每个节点都有一些与之相关的特殊编号Se。每个节点也有一定的功率。树的每个节点的功率定义为节点(包括该节点)子树中重节点的数量。重节点是指其特殊数的除数之和为3的倍数的节点。您将收到Q查询

有两种类型的查询:

  • 类型1:更新节点的特殊编号
  • 类型2:告诉某个节点的功率
输入格式

第一行:两个空格分隔的整数N和Q,分别表示树中的节点数和查询数。接下来的N-1行中的每一行:两个空格分隔的整数U和V,表示它们之间有一条边。 下一行:N个空格分隔的整数,其中i表示与节点i相关的特殊数字。下一行Q中的第一个整数是T(查询类型)。 如果T为1,则后跟2个整数X,表示节点X的特殊编号S的Y将更新为Y如果T为2,则后跟单个整数X

输出格式

对于类型2的每个查询,输出给定节点X的幂。 每个问题的答案都应该换成一行

解释我的问题陈述 基本上,我们有一个带有编号节点(Si)的树。其中一些节点可能有子节点(因为它是一棵树)

问题是要找到节点的“功率”,功率定义为其子节点中“重节点”的数量

“重节点”定义为Si的因子之和为3的倍数的节点

我们需要在这里计算一系列信息:

  • 对于给定的节点,我们需要获取它的所有子节点
  • 对于每个子节点,我们需要找到该节点编号的除数
  • 我们需要求除数的和,并确定它是否是3的倍数
给定样本输入和输出,如

样本输入

5 5 

1 2 

1 3

3 4 

3 5

16 8 17 3 18

2 1

2 3 

1 3 7

2 1

2 3 
样本输出

3

2 

2

1 
我试过的代码

function BinarySearchTree() {
  this.root = null;
}

BinarySearchTree.prototype.insertNode = function (val) {
  var node = {
    data : val, 
    left : null, 
    right : null
  };

  var currentNode;

  if (!this.root) {
    this.root = node;
  } else {
    currentNode = this.root;
    while (currentNode) {
      if (val < currentNode.data) {
          if (!currentNode.left) {
            currentNode.left = node;
            break;
          } else {
            currentNode = currentNode.left;
          }
      } else if (val > currentNode.data) {
        if (!currentNode.right) {
          currentNode.right = node;
          break;
        } else {
          currentNode = currentNode.right;
        }
      } else {
        break;
      }
    }    
  }
};

var BST = new BinarySearchTree();

BST.insertNode(16);
BST.insertNode(8);
BST.insertNode(17);
BST.insertNode(3);
BST.insertNode(18);

console.log(BST);
现在我想以[16,8,17,3,18]的形式传递数组中的数据

要找到每个节点的除数,必须检查除数是否可以被3整除。怎么做


这是正确的做法吗?

我用以下方法尝试了这个问题:

a) 为了获得每个特殊数字的因子总和,请使用筛选方法预静音,如果总和%3==0,则为该节点放入1
b) 应用遍历方法(dfs)来获取下面所有节点(包括该节点)的总和。需要O(n)复杂度。

c) 对于每一个类型为2的查询:我可以用O(1)给出答案。但对于类型1:query,在最坏的情况下,我的代码的复杂性为O(n)。因为对于每个节点,它正在更新每个连续父节点的计数。因此,复杂性是O(q*n),这远远超过了查询的顺序10^6,而n的顺序是10^6

你有想要的结果的例子吗?是的,我可以分享问题陈述的屏幕截图吗?示例输入5 5 1 2 1 3 4 3 5 16 8 17 3 18 2 1 2 3 1 3 1 3 7 2 1 2 3示例输出3 2 1我刚刚编辑了问题并包含了示例输出,即使我对问题陈述感到很困惑,也请让我键入整个问题问题在这里
BinarySearchTree {
  root:
   { data: 16,
     left: { data: 8, left: [Object], right: null },
     right: { data: 17, left: null, right: [Object] } } }