C# 如何从控制台读取二叉树,以便能够计算其节点?
我需要继续处理二叉树的节点,但我不确定如何将其作为输入传递。 假设我有一棵树:C# 如何从控制台读取二叉树,以便能够计算其节点?,c#,graph,binary-tree,C#,Graph,Binary Tree,我需要继续处理二叉树的节点,但我不确定如何将其作为输入传递。 假设我有一棵树: 11 12 13 14 15 16 17 18 19 20 然后我有一个泛型类节点 公共类节点 { 公共T值{get;set;} 公共列表子项{get;set;} 公共bool HasChild{get;set;} 公共bool HasParent{get;set;} 公共节点(T值) { 这个。值=值; this.Children=新列表(); } } 我应该将每个节点添加到节点-
11
12 13
14 15 16
17 18 19 20
然后我有一个泛型类节点
公共类节点
{
公共T值{get;set;}
公共列表子项{get;set;}
公共bool HasChild{get;set;}
公共bool HasParent{get;set;}
公共节点(T值)
{
这个。值=值;
this.Children=新列表();
}
}
我应该将每个节点添加到节点-子节点的列表中,但顺序是什么,所以我保留树的层次结构?让用户选择首先选择要输入的顺序,例如前顺序/顺序/顺序。然后相应地处理输入。希望您能够对其进行编码。树的一种表示形式是一系列对;每个值及其父级(
null
对于根)。您的树可能表示为:
null 11
11 12
11 13
12 14
13 15
13 16
...
空11
11 12
11 13
12 14
13 15
13 16
...
您可以在输入的第一行给出两个整数,例如“n”表示节点数,“m”表示弧数。然后为“n”行提供节点标识符,然后为“m”行提供弧 在解析标识符时,可以创建节点对象,然后在传递圆弧时正确添加子对象 您的图形将如下所示:
10 12
11
12
13
14
15
16
17
18
19
20
11 12
11 13
12 14
12 15
13 15
13 16
14 17
14 18
15 18
15 19
16 19
16 20
这样,您就忘记了圆弧和给定的顺序。您可以在之后识别头部,因为它将是唯一没有父节点的节点。类似这样的内容
public static void Main()
{
Node root = new Node(50);
BinaryTree BT = new BinaryTree(root);
Node left = new Node(17);
Node right = new Node(76);
root.left = left;
root.right = right;
Node lleft = new Node(9);
Node lright = new Node(23);
Node rleft = new Node(54);
root.left.left = lleft;
root.left.right = lright;
root.right.left = rleft;
Node llright = new Node(14);
Node llrleft = new Node(12);
root.left.left.right = llright;
root.left.left.right.left = llrleft;
Node lrright = new Node(19);
root.left.right.left = lrright;
Node rlright = new Node(72);
Node rlrleft = new Node(67);
root.right.left.right = rlright;
root.right.left.right.left = rlrleft;
}
因此,如果它被指定为inoder,并且输入被指定为
123
根是什么?它是一个2的根,1和3作为子对象,还是1
作为根,2的子对象是2,2的子对象是3?您可以将任何树转换为索引树列表,但无法知道顺序树创建了什么列表(除非您不关心使用了许多可能的有效树中的哪一个)。正如索引树定义所述,根元素必须位于左节点和右节点之间。因此,1是左元素,2是根元素,3是右元素。正如我前面所说的,将1作为根元素,2
作为1的右节点,然后将3作为2的右节点,这将是一个完全有效的树。这不是一个平衡的树,但它是一个有效的。也可以将3作为根,2作为3的左节点,1作为2的左节点。所有这三棵树都会生成1 2 3
作为有序遍历的输出。是的,我得到了这一部分,但是如果我们假设我在控制台上以字符串的形式传递树,我必须训练这个字符串,所以我保持对的原样-[11 12][11 13][12 14][12 15]。。。如何进行?它看起来太抽象了:)@Todo对于每一对,你在左边找到值,然后作为一个孩子在右边添加值。我的无知是:如果我将树作为字符串传递并将其存储在数组中,则节点按以下顺序进入数组:11、12、13、14、15。。。因此,我失去了父/子连接。。。当然,如果我对节点成对进行预排序并将它们传递给控制台,那么就很容易了。但是,从字符串中读取数据使我无法想出解决方案。@Todo应该按我显示的那样输入;至少我会这么做。让每一对用换行符分开。读一行,把它分成父/子行,找到父行,添加子行,然后读下一行。如果它们的顺序混乱,则将它们全部放入字典中,其中键为父项,值为子项的值。然后,只需找到根节点,添加它,然后从字典中找到该键的所有值,然后遍历所有子节点,并通过字典
找到它们的子节点,等等。Servy非常感谢您的帮助,但是如果我必须手动预订几百个节点?这太疯狂了,所以我在寻找一种自动化技术。另外,节点可以有相同的值,所以字典不是正确的轨迹,因为它只允许唯一的键。
public static void Main()
{
Node root = new Node(50);
BinaryTree BT = new BinaryTree(root);
Node left = new Node(17);
Node right = new Node(76);
root.left = left;
root.right = right;
Node lleft = new Node(9);
Node lright = new Node(23);
Node rleft = new Node(54);
root.left.left = lleft;
root.left.right = lright;
root.right.left = rleft;
Node llright = new Node(14);
Node llrleft = new Node(12);
root.left.left.right = llright;
root.left.left.right.left = llrleft;
Node lrright = new Node(19);
root.left.right.left = lrright;
Node rlright = new Node(72);
Node rlrleft = new Node(67);
root.right.left.right = rlright;
root.right.left.right.left = rlrleft;
}