ercha2.cs
上传用户:yiyuerguo
上传日期:2014-09-27
资源大小:3781k
文件大小:6k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. public class TreeNode
  3. {
  4. public int data;//节点数据
  5. public TreeNode LeftNode;//左子女
  6. public TreeNode RightNode;//右子女
  7. /// 
  8. /// 构造函数,初始化左右子女为空
  9. /// 
  10. public TreeNode()
  11. {
  12. LeftNode = RightNode = null;
  13. }
  14. }
  15. public class Node
  16. {
  17. private TreeNode root;//根节点
  18. bool temp = false;//默认查找不存在
  19. /// 
  20. /// 构造函数
  21. /// 
  22. public Node()
  23. {
  24. root = null;
  25. }
  26. // 获得该节点最小左子女,用于删除元素使用
  27. // 
  28. // 
  29. // 
  30. TreeNode Min(TreeNode parent)
  31. {
  32. TreeNode temp = parent;
  33. while(temp != null)
  34. {
  35. if(temp.LeftNode == null)
  36. return temp;
  37. else
  38. temp = temp.LeftNode;
  39. }
  40. return null;
  41. }
  42. /// 
  43. /// 删除元素
  44. /// 
  45. /// 
  46. public void Remove(int data)
  47. {
  48. if (root == null)
  49. return;
  50. if(root.data == data)
  51. {
  52. TreeNode tmp = Min(root.RightNode);
  53. if(tmp == null)
  54. {
  55. root = root.LeftNode;
  56. }
  57. else
  58. {
  59. root.data = tmp.data;
  60. Remove(root,root.RightNode,1,tmp.data);
  61. }
  62. }
  63. else if(root.data!=data) 
  64. {
  65. Remove(root,root.RightNode,1,data);
  66. }
  67. else
  68. Remove(root,root.LeftNode,0,data);
  69. }
  70. //在二叉排序树中删除值为data的结点
  71. public TreeNode Remove2(int data)
  72. {
  73. TreeNode p,f,s,q;
  74. p=root;f=null;
  75. //如果p不空就一直找下去
  76. while(p!=null)
  77. {
  78. //找到了 就跳出循环
  79. if(p.data==data) 
  80. break;
  81. f=p;
  82. if(p.data>data) 
  83. p=p.LeftNode;
  84. else
  85. p=p.RightNode;
  86. }
  87. //找不到 返回原根节点
  88. if(p==null) return root;
  89. //如果p无左子树
  90. if(p.LeftNode==null)
  91. {
  92. //p是原二叉排序树的根
  93. if(f==null)
  94. root=p.RightNode;
  95. //如果p是f的左孩子
  96. else if(f.LeftNode==p)
  97. f.LeftNode=p.RightNode;
  98. else
  99. //如果p是f的右孩子
  100. f.RightNode=p.RightNode;
  101. //free(p);
  102. }
  103. //p有左子树
  104. else
  105. {
  106. q=p;s=p.LeftNode;
  107. //寻找p左子树的最右下节点
  108. while(s.RightNode!=null)
  109. {q=s;s=s.RightNode;}
  110. if(q==p)
  111. //将s的左子树链到q上
  112. q.LeftNode=s.LeftNode;
  113. else
  114. q.RightNode=s.LeftNode;
  115. //将s的值赋给p
  116. p.data=s.data;
  117. //free(s);
  118. }
  119. return root;
  120. }
  121. /// 
  122. /// 删除元素递归
  123. /// 
  124. /// 
  125. /// 
  126. /// 
  127. /// 
  128. private void Remove(TreeNode parent,TreeNode cur,int direction,int data)
  129. {
  130. if(cur.data == data)
  131. {
  132. if(cur.LeftNode == null)
  133. {
  134. if(direction == 0)
  135. parent.LeftNode = cur.RightNode;
  136. else
  137. parent.RightNode = cur.RightNode;
  138. }
  139. else if(cur.RightNode == null)
  140. {
  141. if(direction == 0)
  142. parent.LeftNode = cur.LeftNode;
  143. else
  144. parent.RightNode = cur.LeftNode;
  145. }
  146. else
  147. {
  148. TreeNode tmp =Min(cur.LeftNode);
  149. cur.data = tmp.data;
  150. Remove(cur,cur.LeftNode,1,tmp.data);
  151. }
  152. }
  153. else if(cur.data > data)
  154. {
  155. Remove(cur,cur.LeftNode,0,data);
  156. }
  157. else
  158. {
  159. Remove(cur,cur.RightNode,1,data);
  160. }
  161. }
  162. /// 
  163. /// 查找是否存在该元素
  164. /// 
  165. /// 
  166. /// 
  167. public bool Search(int data)
  168. {
  169. bool temp = false;
  170. if(root.data == data)
  171. {
  172. temp = true;
  173. }
  174. else
  175. {
  176. temp = Search(root,data);
  177. }
  178. return temp;
  179. }
  180. /// 
  181. ///查找是否存在该元素,递归
  182. /// 
  183. /// 
  184. /// 
  185. /// 
  186. public bool Search(TreeNode node,int data)
  187. {
  188. if(node.data == data)
  189. {
  190. temp = true;
  191. Console.WriteLine("find");
  192. }
  193. else
  194. {
  195. if(node.data > data)
  196. {
  197. if(node.LeftNode != null)
  198. {
  199. Search(node.LeftNode,data);
  200. }
  201. }
  202. else
  203. {
  204. if(node.RightNode != null)
  205. {
  206. Search(node.RightNode,data);
  207. }
  208. }
  209. }
  210. return temp;
  211. }
  212. public void Search2(int data)
  213. {
  214. if(root==null)
  215. return;
  216. else
  217.   Search(root,data);
  218. }
  219. /// 
  220. /// 插入元素
  221. /// 
  222. /// 
  223. public  void Insert(int data)
  224. {
  225. if( root == null)
  226. {
  227. root = new TreeNode();
  228. root.data = data;
  229. }
  230. else
  231. {
  232. Insert(root,data);
  233. }
  234. }
  235. /// 
  236. ///插入元素,递归
  237. /// 
  238. /// 
  239. /// 
  240. public  void Insert(TreeNode node,int data)
  241. {
  242. if(node.data>data)
  243. {
  244. if(node.LeftNode == null)
  245. {
  246. TreeNode temp = new TreeNode();
  247. temp.data = data;
  248. node.LeftNode = temp;
  249. }
  250. else
  251. {
  252. Insert(node.LeftNode,data);
  253. }
  254. }
  255. else
  256. {
  257. if(node.RightNode== null)
  258. {
  259. TreeNode temp = new TreeNode();
  260. temp.data = data;
  261. node.RightNode = temp;
  262. }
  263. else
  264. {
  265. Insert(node.RightNode,data);
  266. }
  267. }
  268. }
  269. public  void PrintTree(TreeNode node,int layer)
  270. {
  271. if(node==null)
  272.   return;
  273. PrintTree(node.RightNode, layer+3);
  274. for(int i=0; i<layer; i++)
  275. Console.Write(" ");
  276. Console.Write("{0}",node.data);
  277. Console.WriteLine();
  278.             PrintTree(node.LeftNode, layer+3);
  279. }
  280.         
  281. public  void PrintTree2()
  282. {
  283. if(root==null)
  284. return;
  285. else
  286. PrintTree(root,9);
  287. }
  288. }
  289. class myApp
  290. {
  291. public static void Main()
  292. {
  293. int z=0;
  294. string buff;
  295. TreeNode first = new TreeNode();
  296. Node Tfirst = new Node();
  297. for(;;)
  298. {
  299.   Console.WriteLine("please intput a int");
  300.   Console.WriteLine("if input -1 then break");
  301.   buff= Console.ReadLine();
  302.   z= Convert.ToInt32(buff);
  303.           if(z==-1)
  304.   break;
  305.   Tfirst.Insert(z);
  306.     }
  307. Tfirst.PrintTree2();
  308.         Console.WriteLine("please intput a int which you want to search");
  309.         buff= Console.ReadLine();
  310. z= Convert.ToInt32(buff);
  311.         Tfirst.Search2(z);
  312. Console.WriteLine("please intput a int which you want to remove");
  313. buff= Console.ReadLine();
  314. z= Convert.ToInt32(buff);
  315. Tfirst.Remove2(z);
  316.         Tfirst.PrintTree2();
  317. Console.ReadLine();
  318.    
  319. }
  320. }