如何从控制台中读取二叉树,以便能够锻炼其节点

本文关键字:节点 控制台 二叉树 读取 | 更新日期: 2023-09-27 18:16:48

我需要继续处理二叉树的节点,但我不确定如何将其作为输入传递。假设我有一个树:

     11
    12 13
   14 15 16
  17 18 19 20

然后我有一个通用类Node<T>

public class Node<T>
    {
        public T Value { get; set; }
        public List<Node<T>> Children { get; set; }
        public bool HasChild { get; set; }
        public bool HasParent { get; set; }
        public Node(T value)
        {
            this.Value = value;
            this.Children = new List<Node<T>>();
        }
    } 

我应该将每个节点添加到子节点列表中,但是以什么顺序,这样我就保持了树的层次结构?

如何从控制台中读取二叉树,以便能够锻炼其节点

给用户一个选择,首先选择要输入的订单,如Preorder/Inorder/Postorder。然后相应地处理输入。

树的一种表示形式是一系列对;每个值及其父值(null为根)。您的树可能表示为:

<>以前零1111日1211日1312日1413日1513日16…

你可以在第一行输入两个整数,说'n'是节点的数量,'m'是弧的数量。然后用'n'行表示节点的标识符,然后用'm'行表示圆弧。

当您解析标识符时,您可以创建您的Node对象,然后当您传递弧时,您可以正确地添加子对象。

你的图形会是这样的:

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;
                      }