Algorithm 如何将树拆分为具有偶数节点的最大子树?

Algorithm 如何将树拆分为具有偶数节点的最大子树?,algorithm,Algorithm,看到这个问题如下,不知道如何解决: 给定任意树,将其拆分为尽可能多的子树 子树的节点数必须为偶数 有什么想法吗?类似的方法可能是,遍历树,获取每个节点的计数。如果计数为偶数,则添加节点 List<Node> subTrees = new List<Node>(); int GetCount(Node root) { if (root == null) return 0; return GetCount(root.Left) + GetCount(root.R

看到这个问题如下,不知道如何解决:

给定任意树,将其拆分为尽可能多的子树 子树的节点数必须为偶数


有什么想法吗?

类似的方法可能是,遍历树,获取每个节点的计数。如果计数为偶数,则添加节点

List<Node> subTrees = new List<Node>();

int GetCount(Node root)
{
   if (root == null) return 0;
   return GetCount(root.Left) + GetCount(root.Right) + 1;
}
void BuildSubTrees(Node root)
{
   if (root == null) return;

   if(GetCount(root) % 2 == 0){subTrees.Add(root);}
   BuildSubTrees(root.Left);
   BuildSubTrees(root.Right);
}
列表子树=新列表();
int GetCount(节点根)
{
if(root==null)返回0;
返回GetCount(root.Left)+GetCount(root.Right)+1;
}
无效构建子树(节点根)
{
if(root==null)返回;
如果(GetCount(root)%2==0){subTrees.Add(root);}
构建子树(root.Left);
构建子树(root.Right);
}

我假设它是一棵二叉树。如果不是,则不使用
,而是检查它的所有
邻居

我将把这个问题分解如下:

  • 穿过这棵树。树中的每个节点表示主树的一个子树
  • 将树的每个节点的引用保存在数组中
  • 遍历数组并确定每个根的权重或节点数
  • 输出/过滤权重为偶数的子树引用数组(从步骤2开始)
    请澄清:根据我的理解,是否所有子树都有偶数个节点,或者我们应该有偶数个节点的最大子树数,问题是通过分解原始树来找到尽可能多的子树,但子树必须有偶数个节点。因此,如果树有奇数个节点,就没有解决方案了?@IvayloStrandjev,我考虑过这个问题,但问题没有给出这方面的信息。在我读了你的问题后,我开始考虑将节点数为偶数的树拆分为两个节点的子树。此解决方案假设不同的子树可以彼此共享节点。最初的问题没有提到这个属性。因此,我们可能必须解决这两种情况。1> 子树不能共享节点。2> 子树可以共享节点。如果是,则在将节点添加到列表之前,必须确保节点在任何节点中没有自身或任何子节点,并且在列表中没有其子节点。基本上是遍历树的另一种实用方法。