在 C# 中查找树中的先前节点

FInd Previous nodes in a Tree in C#

我正在尝试编写一个函数 Previous(),以获取树的前一个节点。语句是:“我们有一棵树,它是使用 class 节点构建的,其中 class 的一个实例代表树中的一个节点。为简单起见,该节点有一个 int 类型的数据字段. 您的任务是编写扩展方法 NodeExtensions.Previous() 以查找树中的前一个元素。您可以根据需要编写任意数量的辅助方法,但不要更改扩展方法的签名 NodeExtensions.Previous()."

节点class是这样的:

public class Node
{
    private List<Node> _children;

    public Node(int data, params Node[] nodes)
    {
        Data = data;
        AddRange(nodes);
    }

    public Node Parent { get; set; }

    public IEnumerable<Node> Children
    {
        get
        {
            return _children != null
                ? _children
                : Enumerable.Empty<Node>();
        }
    }

    public int Data { get; private set; }

    public void Add(Node node)
    {
        Debug.Assert(node.Parent == null);

        if (_children == null)
        {
            _children = new List<Node>();
        }

        _children.Add(node);
        node.Parent = this;
    }

    public void AddRange(IEnumerable<Node> nodes)
    {
        foreach (var node in nodes)
        {
            Add(node);
        }
    }

    public override string ToString()
    {
        return Data.ToString();
    }
}

我需要这样写一个扩展方法:

using System;
using System.Linq;

public static class NodeExtensions
{
    public static Node Previous(this Node node)
    {
        // TODO Implement extension method here
        
    }
  
}

我有一个测试用例:

using System;
using System.Text;
using NUnit.Framework;

public class NodeExtensionsTests
{
    [Test]
    public void Test()
    {
        // Test tree:
        // 
        // 1
        // +-2
        //   +-3
        //   +-4
        // +-5
        //   +-6
        //   +-7
        //
        var lastNode = new Node(7);
        var tree = new Node(
            1,
            new Node(
                2,
                new Node(3),
                new Node(4)),
            new Node(
                5,
                new Node(6),
                lastNode));

        // Expected output:
        //
        // 7
        // 6
        // 5
        // 4
        // 3
        // 2
        // 1
        //
        var n = lastNode;
        while (n != null)
        {
            Console.WriteLine(n.Data);
            n = n.Previous();
        }

        // Test
        //
        n = lastNode;
        Assert.AreEqual(7, n.Data);
        n = n.Previous();
        Assert.AreEqual(6, n.Data);
        n = n.Previous();
        Assert.AreEqual(5, n.Data);
        n = n.Previous();
        Assert.AreEqual(4, n.Data);
        n = n.Previous();
        Assert.AreEqual(3, n.Data);
        n = n.Previous();
        Assert.AreEqual(2, n.Data);
        n = n.Previous();
        Assert.AreEqual(1, n.Data);
        n = n.Previous();
        Assert.IsNull(n);
    }
}

无论我尝试什么,它要么进入无限循环,要么只是 returns 根节点而不是“所有兄弟姐妹”。有人可以帮我吗?

我认为这对你有用

public static class NodeExtensions
{
    public static Node Previous(this Node node)
    {
        if (node.Parent == null) { return null; }
        var brothers = (List<Node>) node.Parent.Children;
        var index = brothers.IndexOf(node);
        if(index == 0) 
        {
            return node.Parent;
        }
        else
        {
            var next = brothers[index - 1];
            while (next.Children.Any()) 
            {
                next = next.Children.Last();
            }
            return next;
        }
    }

}