C# でのツリーデータ構造

Muhammad Zeeshan 2023年10月12日
  1. C# のツリーデータ構造
  2. C# でツリーデータ構造を構築する手順
C# でのツリーデータ構造

この記事では、C# のツリーについて説明します。データ構造は、私たちが最初に知る必要があることです。

データ構造をより効率的に使用して、データをコンピューターに配置および保存できます。スタック、リンクリスト、およびキューはすべて、シーケンシャルデータ構造の例です。

C# のツリーデータ構造

ツリーの形で編成された一種の階層データは、ツリーデータ構造と呼ばれます。これは、中央ノード、構造ノード、およびエッジによって相互にリンクされたサブノードで構成されます。

ツリーデータ構造のルート、ブランチ、およびリーフがリンクされていると述べることもできます。

ツリーは、階層構造でデータを表すために使用される場合があります。ツリーを構成する各ノードは、データと参照の 2つのサブパートで構成されます。

ツリーの最上部にあるノードは、ルートと呼ばれます。そのすぐ下にある 2つの製品は、左サブツリーと右サブツリーと呼ばれます。

ツリーノードを作成するためのコードは次のようになります。

struct node {
  int Data;
  struct node
  *Leftchild;
  struct node
  *Rightchild;
};

C# のツリーデータ構造の基本用語

以下は、C# のツリーデータ構造で知っておく必要のある基本的な用語です。

  • ルートノード:ツリーの最上位にあるノードはルートと呼ばれます。各ツリーには単一のルートがあり、単一のルートがルートから他のノードにつながります。
  • レベルノード:ノードのレベルは、生成されたノードの数を反映します。ノードは 1、2 などのレベルの増分で下降し、ルートノードは常に最上位になります。
  • サブツリーノード:ノードの子孫はサブツリーで表されます。
  • 親ノード:ルート以外のノードが親ノードに接続されている場合、そのノードは親と呼ばれます。
  • 子ノード:ノードのエッジが下降するとき、そのノードはその子ノードと呼ばれます。

C# のツリーデータ構造の利点

C# でツリーデータ構造を使用する 2つの利点は次のとおりです。

  1. 配列やリンクリストなどの他のデータ構造と比較する場合、ツリーのサイズを指定する必要はありません。その結果、ツリーはそのストレージスペースの点で効率的です。
  2. 対照的に、ツリーを操作すると、リンクリストで必要となるノードの挿入、削除、検索などの手間のかかる操作が不要になります。

C# でツリーデータ構造を構築する手順

ここに、C# のツリーデータ構造の例があります。以下の手順を読んでください。

  1. まず、次のライブラリが必要です。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
  2. int 型変数 keyleftn を左側のノードとして、rightn を右側のノードとして格納する Shanii クラスに node というクラスを作成します。

    class node {
      public int key;
      public node leftn, rightn;
    };
    
  3. 次に、ノードのオブジェクトからルートノードと z というノードのリストを作成します。

    static node rootnode = null;
    static List<node> z = new List<node>();
    
  1. データを使用してノードを生成するには、newnode と呼ばれる関数を作成する必要があります。最初は、この新しいノードの子は両方とも null です。

    static node newnode(int val) {
      node y = new node();
      y.key = val;
      y.leftn = null;
      y.rightn = null;
      return y;
    }
    
  2. ここで、if チェックを使用してノードにアクセスできるかどうかを確認します。はいの場合、現在のノードの左の子が使用されます。

    if (rootnode == null) {
      rootnode = node;
    }
    
  3. 使用可能な場合、現在のノードの子が使用されます。このノードの左の子はすでに使用されているため、右の子が使用されます。

    else if (z[0].leftn == null) {
      z[0].leftn = node;
    }
    
  4. ツリーに新しく追加されたノードのアドレスがキューに追加されます。したがって、子のノードに関する情報を格納するために使用される場合があります。

    else {
      z[0].rightn = node;
      z.RemoveAt(0);
    }
    z.Add(node);
    
  5. 次のクラスを使用してツリーを構築します。

    static void Constructtree(int[] ar, int a) {
      for (int i = 0; i < a; i++) InsrtVal(ar[i]);
    }
    
  6. 次の関数は、ノードをレベルに従って編成します。

    static void OrderData(node root) {}
    

10.最後に、ツリーとそのパラメーターを作成および整理するために必要な関数を呼び出します。

```c#
static void Main() {
  int[] array = { 29, 39, 49, 59, 69, 79 };
  int n = array.Length;
  Constructtree(array, n);
  OrderData(rootnode);
  Console.ReadKey();
}
```

完全なソースコード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tree_example {
  class Shanii {
    class node {
      public int key;
      public node leftn, rightn;
    };
    static node rootnode = null;
    static List<node> z = new List<node>();

    static node newnode(int val) {
      node y = new node();
      y.key = val;
      y.leftn = null;
      y.rightn = null;
      return y;
    }

    static void InsrtVal(int newval) {
      node node = newnode(newval);
      if (rootnode == null) {
        rootnode = node;
      }

      else if (z[0].leftn == null) {
        z[0].leftn = node;
      }

      else {
        z[0].rightn = node;
        z.RemoveAt(0);
      }
      z.Add(node);
    }

    static void Constructtree(int[] ar, int a) {
      for (int i = 0; i < a; i++) InsrtVal(ar[i]);
    }

    static void OrderData(node root) {
      if (root == null)
        return;
      List<node> n = new List<node>();
      n.Add(root);
      while (n.Count > 0) {
        Console.Write(n[0].key + " ");
        if (n[0].leftn != null)
          n.Add(n[0].leftn);
        if (n[0].rightn != null)
          n.Add(n[0].rightn);
        n.RemoveAt(0);
      }
    }

    static void Main() {
      int[] array = { 29, 39, 49, 59, 69, 79 };
      int n = array.Length;
      Constructtree(array, n);
      OrderData(rootnode);
      Console.ReadKey();
    }
  }
}

出力:

29 39 49 59 69 79 
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn