gpt4 book ai didi

c# - 如何找到树中的下一个元素

转载 作者:行者123 更新时间:2023-12-04 10:03:30 25 4
gpt4 key购买 nike

我有一棵树,如下所示:

/* Tree 
* 5
* / \
* 3 1
* / \ / \
* 2 4 6 7
*/

我正在使用名为 Node 的类创建这棵树,如下所示:
var root = new Node(
5,
new Node(
3,
new Node(2),
new Node(4)),
new Node(
1,
new Node(6),
new Node(7)));

结果我想打印出有序树: 1 2 3 4 5 6 7 .
我能够找到下一个更大的元素,引用这个例子 https://www.geeksforgeeks.org/next-larger-element-n-ary-tree/ ,但我不知道如何按顺序打印所有节点。

编辑:
public static class Program
{
static void Main(string[] args)
{
var root = new Node(
5,
new Node(
3,
new Node(2),
new Node(4)),
new Node(
1,
new Node(6),
new Node(7)));

var n = root;

while (n != null)
{
Console.WriteLine(n.Data);
n = n.NextNode();
}
}

public static Node NextNode(this Node node)
{
var newNode = NextLargerElement(node, node.Data);

return newNode;
}

public static Node res;
public static Node NextLargerElementUtil(Node root, int x)
{
if (root == null)
return null;

if (root.Data > x)
if ((res == null || (res).Data > root.Data))
res = root;

foreach (var children in root.Children)
{
NextLargerElementUtil(children, x);
}

return res;
}

static Node NextLargerElement(Node root, int x)
{
res = null;

NextLargerElementUtil(root, x);

return res;
}
}

Node类(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();
}
}

最佳答案

您需要一个 recursive/iterator函数来遍历所有分支并获取所有节点:

public IEnumerable<Node> GetAllNodes(Node parent)               
{
IEnumerable<Node> GetAllNodes(IEnumerable<Node> children)
{
foreach(var child in children)
{
yield return child;
foreach(var c in GetAllNodes(child.Children))
yield return c;
}
}

yield return parent;

foreach(var child in GetAllNodes(parent.Children))
yield return child;
}

如果你有一棵树,比如:

var root = new Node(5,
new Node(3, new Node(11), new Node(12),
new Node(2),
new Node(4), new Node(13)),
new Node(1, new Node(14), new Node(15),
new Node(6, new Node(16), new Node(17)),
new Node(7, new Node(8), new Node(9))), new Node(10));

调用函数,传递 root节点和 OrderBy Data属性(property):

var q = GetAllNodes(root).OrderBy(x => x.Data).Select(x => x.Data);

Console.WriteLine(string.Join(", ", q));

输出是:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17

最好将其设为 extension methodNode类型。

static class Extensions
{
public static IEnumerable<Node> GetAllNodes(this Node parent)
{
IEnumerable<Node> GetAllNodes(IEnumerable<Node> children)
{
foreach (var child in children)
{
yield return child;
foreach (var c in GetAllNodes(child.Children))
yield return c;
}
}

yield return parent;

foreach (var child in GetAllNodes(parent.Children))
yield return child;
}
}

所以你可以这样调用它:

var q = root.GetAllNodes().OrderBy(x => x.Data).Select(x => x.Data);

Console.WriteLine(string.Join(", ", q));

关于c# - 如何找到树中的下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61713858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com