脚踏实地-算法与数据结构-树

树和图都有点难,以后慢慢修改维护。

View Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace 源代码
  7 {
  8     class TreeNode
  9     {
 10         public TreeNode lc;
 11         public TreeNode rc;
 12         public int value;
 13         /*
 14          * 如果用三叉链表表示
 15          * 
 16          * 则加入public TreeNode par  表示指向父节点
 17          * */
 18         public TreeNode(int value)
 19         {
 20             this.value = value;
 21         }
 22 
 23 
 24     }
 25 
 26     class BinaryTreeDs
 27     {
 28         public TreeNode head;
 29         public int Num;
 30         public BinaryTreeDs()
 31         {
 32             Num = 0;
 33         }
 34         /// <summary>
 35         /// 将ti作为新节点的左子树,或者右子树
 36         /// </summary>
 37         /// <param name="value"></param>
 38         /// <param name="t1"></param>
 39         public void InsertRLC(int value,TreeNode t1)
 40         {
 41             TreeNode t = new TreeNode(value);
 42             t.lc = t1;
 43         }
 44 
 45         public void Insert(int value, TreeNode t1)
 46         {
 47             TreeNode t = new TreeNode(value);
 48             t.lc = t1;
 49             t.rc = t1.rc;
 50         }
 51         /// <summary>
 52         /// 遍历并找到某一个节点this.value=value的节点
 53         /// </summary>
 54         /// <param name="boot"></param>
 55         /// <param name="value"></param>
 56         public TreeNode  Search(TreeNode root, int value)
 57         {
 58             TreeNode t = root;
 59             if (!t.value.Equals(value))
 60             {
 61                 return t ;
 62             }
 63 
 64             if (t.lc != null)
 65             {
 66                 return Search(t.lc, value);
 67             }
 68             if (t.rc != null)
 69             {
 70                 return Search(t.rc, value);
 71             }
 72             return null;
 73         }
 74         /// <summary>
 75         /// 二叉树的三种遍历方式
 76         /// </summary>
 77         /// <param name="t"></param>
 78         public void inorder(TreeNode t)
 79         {
 80             //中序遍历
 81             if (t.lc != null)
 82             {
 83                 inorder(t.lc);
 84                 Console.WriteLine(t.lc.value);
 85                 inorder(t.rc);
 86                 //先序遍历
 87 
 88                 Console.WriteLine(t.lc.value);
 89                 inorder(t.lc);
 90                 inorder(t.rc);
 91 
 92                 //后序遍历
 93                 inorder(t.lc);
 94                 inorder(t.rc);
 95                 Console.WriteLine(t.lc.value);
 96             }
 97         }
 98 
 99         /*
100          * 哈夫曼树的构造方法,
101          * 1  排序,选择权值最小的两个节点,构成左右子树,大的都左,小的都右。
102          * 2 两个权值加上,放到原来的里面构成新的节点还是比较找到两个最小的
103          */
104 
105         /*
106          * 至于树就要用到多重链表发来表示了,主要有两个
107          * 1 每个节点的指针域等于节点的个数
108          * 2 每个节点的指针域  自己做自己的(不太好操作)
109          * 
110          */
111         class DSnode
112         {
113             public int value;
114             public DSnode(int value)
115             {
116                 this.value = value;
117             }
118             public DSnode [] Fnext;
119             public DSnode par;
120         }
121         class DSnodeLianshi
122         {
123             public int value=20;
124             public int ChildNum=0;
125             public DSnodeLianshi(int value, int i)
126             {
127                 this.value = value;
128                 ChildNum = i;
129                 for (int i = 0; i < ChildNum ; i++)
130                 {
131 
132                 }
133                 //动态创建数组大小的两种方式  或者用list方法都行
134                 DSnode[] s = new DSnode[ChildNum];
135             }
136             //DSnode[] Child=new DSnode[value];
137         }
138 
139 
140         /// <summary>
141         /// 双亲表示法 借助数组的帮助,顺序存储自己构造的类型
142         /// 两个字段,一个用来表示孩子的数据,另外一个用来表示
143         /// 父节点在数组中的索引的位置。
144         /// </summary>
145         class ParNode
146          {
147             public int value;
148             public int ParPisthion;
149             public ParNode(int value,int i)
150             {
151                 this.value = value;
152                 this.ParPisthion = i;
153             }
154         }
155         /// <summary>
156         /// 孩子链表表示法
157         /// 用于个数组一个个的放入节点,然后用一个指针指向他的第一个孩子节点
158         /// 
159         /// 这个孩子节点在单独一个节点链表,孩子节点有两个信息,第一是所在数组
160         /// 中的索引位置,第二是直线下一个孩子节点的索引域
161         /// </summary>
162         class ChildNode
163         {
164             public int value;//存放节点所在数组位置的索引
165             public ChildNode(int value)
166             {
167                 this.value = value;
168             }
169             public ChildNode next;//存放指向下一个节点的索引下一个节点
170             
171         }
172         /// <summary>
173         /// 孩子双亲表示法,结合上面两种的方式
174         ///   孩子节点用三个字段表示
175         ///   1 本身的值
176         ///   2 节点的父亲在 节点数组中的位置索引
177         ///   3 指向第一个孩子节点的索引的位置
178         ///   
179         /// 至于孩子节点的链表表示的class就与上面那个想通了
180         /// 
181         /// </summary>
182         class ChildParentNode
183         {
184       public int value;//存放节点所在数组位置的索引
185             public ChildParentNode(int value)
186             {
187                 this.value = value;
188             }
189             public ChildNode next;
190             public int PerSuoYin;
191         }
192         /// <summary>
193         /// 孩子兄弟表示法
194         /// 节点用三个域表示
195         /// 1 表示自己
196         /// 2 指向自己第一个孩子
197         /// 3 指向自己紧挨着的下一个兄弟,没有就为空
198         /// </summary>
199         class ChildBroNode
200         {
201             public int value;
202             public ChildBroNode FiChild;
203             public ChildBroNode Fibro;
204 
205         }
206         /// <summary>
207         /// 树的遍历,有三种 先序遍历,后序遍历,层序遍历
208         /// </summary>
209         /// <param name="t"></param>
210         public void PreOrder(TreeNode t)
211         {
212             if (t == null)
213             {
214                 return;
215             }
216             Console.WriteLine(t.value );
217             for (int i = 0; i < t.ChildLength; i++)//孩子的个数,没有做
218             {
219                      PreOrder (t.Child[i]);
220             }
221 
222         }
223         /// <summary>
224         /// 后序遍历   森林的遍历方式也有两种吧
225         /// </summary>
226         /// <param name="t"></param>
227         public void PreOrder(TreeNode t)
228         {
229             if (t == null)
230             {
231                 return;
232             }
233            
234             for (int i = 0; i < t.ChildLength; i++)//孩子的个数,没有做
235             {
236                 PreOrder(t.Child[i]);
237             }
238             Console.WriteLine(t.value);
239         }
240 
241     }
242 }

 

 

posted @ 2012-09-28 11:19  忧悦  阅读(104)  评论(0)    收藏  举报