在 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;
}
}
}
我正在尝试编写一个函数 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;
}
}
}