Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Iphone 我该怎么做?不_Iphone - Fatal编程技术网

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替换为访问节点所需的任何操作。请在问题陈述中发布您的代码。这将使帮助变得更容易。我看到了链接,但指导方针建议您将代码放入问题中,以使其有益于社区的其余部分上面的代码中没有您想要的返回类型。。。请把它修好,让我知道你到底想要什么。