Iphone 我该怎么做?不
有什么可能的办法吗 我知道这一点乍一看是没有道理的,但我能设法做到吗Iphone 我该怎么做?不,iphone,Iphone,有什么可能的办法吗 我知道这一点乍一看是没有道理的,但我能设法做到吗 p一般树的顺序遍历实际上没有意义。因为没有访问当前节点的顺序。“顺序”只对二叉树有意义 为了对一般树有意义,您必须定义访问当前节点的顺序。因为唯一有意义的两个选择是首先访问当前节点,这是预订单,最后一个是后订单。因此,对于一般的树来说,顺序并没有多大意义 当然,如果您的通用树有一个特定的结构,那么InOrder是有意义的。如果你总是有前3个孩子是左的,所有其他的都是右的,那么你的算法看起来像这样 inorder(node)
p一般树的顺序遍历实际上没有意义。因为没有访问当前节点的顺序。“顺序”只对二叉树有意义 为了对一般树有意义,您必须定义访问当前节点的顺序。因为唯一有意义的两个选择是首先访问当前节点,这是预订单,最后一个是后订单。因此,对于一般的树来说,顺序并没有多大意义 当然,如果您的通用树有一个特定的结构,那么InOrder是有意义的。如果你总是有前3个孩子是左的,所有其他的都是右的,那么你的算法看起来像这样
inorder(node)
if node == null then return
inorder(node.first)
inorder(node.second)
inorder(node.third)
visit(node)
foreach (remainingNode in RemainingNodes)
inorder(remainingNode)
作为扩展方法的泛型代码
static public IEnumerable<Node<T>> InOrder<T>(this Node<T> thisNode)
{
var list = new List<Node<T>>();
IEnumerable<Node<T>> leftNodes;
IEnumerable<Node<T>> rightNodes;
if (thisNode.Children == null)
{
leftNodes = new List<Node<T>>();
rightNodes = new List<Node<T>>();
}
else
{
leftNodes = thisNode.Children.Take((int)Math.Ceiling(thisNode.Children.Count() / 2.0)).ToList();
rightNodes = thisNode.Children.Skip(leftNodes.Count()).ToList();
}
if (leftNodes.Any())
{
foreach (var child in leftNodes)
{
list.AddRange(child.InOrder());
}
}
list.Add(thisNode);
if (rightNodes.Any())
{
foreach (var child in rightNodes)
{
list.AddRange(child.InOrder());
}
}
return list;
}
顺序遍历要求按顺序访问节点 左边 这 正当 对于非二叉树,这种行为没有意义,因为没有左或右专用节点。正如Kevin所说,执行前序或后序遍历才真正有意义;但是,如果要执行顺序式遍历,可以访问一半的子节点、此节点,然后访问另一半。不过,这并不符合顺序遍历的精神 例如,假设您的节点有5个子节点。这将使顺序遍历: 儿童1 儿童2 儿童3 这 儿童4 儿童5 只是为了争论。从技术上讲,孩子3和这个可以互换,但同样的问题也会出现 如果随后移除子级5,则顺序遍历将为: 儿童1 儿童2 这 儿童3 儿童4 固有的秩序也发生了变化 但是,如果要维护两个子级列表:一个是leftChildren,另一个是rightChildren,那么顺序遍历与二叉树中的遍历一样有意义。然而,如何选择哪个孩子进入哪个列表,完全是另一个问题 编辑:由于您似乎想继续执行此操作,因此可以使用以下方法:
public IEnumerable<Node<T>> InOrder()
{
if (Children != null)
{
for (int i = 0; i < Children.length; i++)
{
if (i == Children.length / 2)
{
yield return this;
}
foreach (var node in Children[i].InOrder())
{
yield return node;
}
}
}
}
你读了吗?请告诉我们你已经做了什么,以及到目前为止你已经尝试了什么。顺序遍历只对二叉树有意义。如果您有N个子节点,那么inoder应该是什么意思?按序树推断,在该树上按序遍历将生成一个排序列表,因为该树是按某种机制排序的,就像具有左右模式的二元搜索树。如果您的“常规”树具有按顺序添加数据的排序机制,那么应该应用相同的逻辑。如果树中没有顺序,那么就没有逻辑上的等价物,除非您想在处理前半部分子节点之前完全任意处理前半部分子节点。@Marcougello:当然,这不是不可能的-只要随时访问当前节点即可。但是,除非子节点和父节点之间存在定义良好的关系,否则按顺序调用它是没有意义的。在这种情况下,请使用该关系作为指导。在子节点集合上使用count方法来确定之前和之后的子节点数。什么是泛型版本?除了有一个节点集合和一个名为Name的属性外,这不需要任何假设。将Console.WriteLine替换为访问节点所需的任何操作。请在问题陈述中发布您的代码。这将使帮助变得更容易。我看到了链接,但指导方针建议您将代码放入问题中,以使其有益于社区的其余部分上面的代码中没有您想要的返回类型。。。请把它修好,让我知道你到底想要什么。