創作內容

9 GP

C# Data Structures - Tree

作者:貓貓風 ฅ●ω●ฅ│2019-09-20 11:15:56│巴幣:18│人氣:1241
.















樹(TREE)是資料結構中常用的儲存方式之一

屬於 Linked List的延伸,特徵為只有一個根(ROOT) 且不具循環性 (Cycle)

在樹中若要從root尋找特定node,一定只存在一條路徑(path)。

每個node只會有一個parent(父節點)。


以下為最簡單的 樹狀結構建立 ,此程式只有基本的連結,尚無加入階層架構

如需轉為二元樹  ALV樹 等,再以此程式做延伸


CLASS NTree


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows.Forms;  
  6.   
  7. namespace Tree_test  
  8. {  
  9.   
  10.     delegate void TreeVisitor<T>(T nodeData);  
  11.   
  12.     class NTree< T >  
  13.     {  
  14.         public T data;  
  15.         private LinkedList<NTree<T>> children;  
  16.         int member_count = 0;  
  17.   
  18.         public NTree(T data)  
  19.         {  
  20.             this.data = data;  
  21.             children = new LinkedList<NTree<T>>();  
  22.         }  
  23.   
  24.         public void AddChild(T data)  
  25.         {  
  26.             children.AddFirst(new NTree<T>(data));  
  27.             member_count++;  
  28.         }  
  29.   
  30.         public int get_tree_member()  
  31.         {  
  32.             return member_count;  
  33.         }  
  34.   
  35.         public NTree<T> GetChild(int i)  
  36.         {  
  37.             foreach (NTree<T> n in children)  
  38.                 if (--i == 0)  
  39.                     return n;  
  40.             return null;  
  41.         }  
  42.   
  43.         public void DeleteChild()  
  44.         {  
  45.             if (member_count == 0)  
  46.             {  
  47.                 MessageBox.Show("Tree have no leaves.");  
  48.             }  
  49.             else  
  50.             {  
  51.                 member_count--;  
  52.                 children.RemoveLast();  
  53.             }  
  54.         }  
  55.   
  56.         public void Traverse(NTree<T> node, TreeVisitor<T> visitor)  
  57.         {  
  58.             visitor(node.data);  
  59.             foreach (NTree<T> kid in node.children)  
  60.                 Traverse(kid, visitor);  
  61.         }  
  62.     }  
  63. }  


CLASS MAIN


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9.   
  10. namespace Tree_test  
  11. {  
  12.     public partial class Form1 : Form  
  13.     {  
  14.         public Form1()  
  15.         {  
  16.             InitializeComponent();  
  17.         }  
  18.   
  19.         NTree<String> _tree = new NTree<String>("ROOT");  
  20.         int width_pos = 10, height_pos = 100;  
  21.         int _last;  
  22.    
  23.         private void Form1_Load(object sender, EventArgs e)  
  24.         {  
  25.   
  26.             renew_data();  
  27.   
  28.         }  
  29.   
  30.         private void button1_Click(object sender, EventArgs e)  
  31.         {  
  32.             _tree.AddChild(textBox1.Text);  
  33.             renew_data();  
  34.         }  
  35.   
  36.         private void renew_data()  
  37.         {  
  38.             //刪除前一次資料    
  39.             for (int i = 1; i <= _tree.get_tree_member()-1; i++)  
  40.             {  
  41.                 this.Controls.RemoveByKey(i.ToString());  
  42.                 this.Controls.RemoveByKey(i.ToString()+"P");  
  43.             }  
  44.   
  45.             //更新頁面  
  46.             width_pos = 10;  
  47.             height_pos = 100;  
  48.             for (int i = 1; i <= _tree.get_tree_member(); i++)  
  49.             {  
  50.                 NTree<String> result = _tree.GetChild(i);  
  51.                 TextBox txt_data = new TextBox();  
  52.                 PictureBox pic = new PictureBox();  
  53.                 pic.Size = new Size(61,32);  
  54.                 txt_data.Size = new Size(100, 10);  
  55.                 if ((i-1) % 4 == 0) { height_pos += 40; width_pos = 10; }  
  56.                 txt_data.Location = new Point(width_pos, height_pos);  
  57.                 pic.Location = new Point(width_pos += 100, height_pos);  
  58.                 pic.Name = i.ToString()+"P";  
  59.                 pic.Image = Properties.Resources.arrow;  
  60.                 txt_data.Text = result.data.ToString();  
  61.                 txt_data.Name = i.ToString();  
  62.                 _last = i ;  
  63.                 Controls.Add(txt_data);  
  64.                 Controls.Add(pic);  
  65.                 width_pos += 100;  
  66.             }  
  67.         }  
  68.   
  69.         private void button2_Click(object sender, EventArgs e)  
  70.         {  
  71.             _tree.DeleteChild();  
  72.             Controls.RemoveByKey(_last.ToString()); //delete last index  
  73.             Controls.RemoveByKey(_last.ToString()+"P");  
  74.             _last--;  
  75.         }  
  76.     }  
  77. }  


執行結果

加入點一


加入點2


加入6個點


刪除點1  (刪除一律從尾端開始)


刪除點2


相關資料結構





引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4534854
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:C#|涼涼風

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

9喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Windows系統 安裝... 後一篇:貓咪大戰爭 斷罪天使降臨...

追蹤私訊切換新版閱覽

作品資料夾

doublexplay還在找小說看嗎
【輕小說】什麼?在工作崗位上過勞死的六十多歲社畜,竟然轉生到異世界變成美少女?看更多我要大聲說昨天19:16


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】