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;

                      }