脚踏实地-算法与数据结构-树
树和图都有点难,以后慢慢修改维护。
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 }


浙公网安备 33010602011771号