zoukankan      html  css  js  c++  java
  • 二叉搜索树类的C#实现

    实现:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. /**
    7. * 二叉搜索树
    8. * 一棵二叉搜索树是满足以下条件的二叉树
    9. * 1.所有左节点的值都小于本节点的值
    10. * 2.所有节点的值都小于右节点的值
    11. **/
    12. namespace Algorithm {
    13. class BSTreeNode <T> where T:IComparable {
    14. public BSTreeNode<T> left { get; set; }
    15. public BSTreeNode<T> right { get; set; }
    16. public BSTreeNode<T> parent { get; set; }
    17. public T key { get; set; }
    18. public BSTreeNode(T k) {
    19. key = k;
    20. }
    21. }
    22. class BSTree<T> where T : IComparable {
    23. public BSTreeNode<T> Root;
    24. public int Count = 0;
    25. public BSTree(T key) {
    26. Root = new BSTreeNode<T>(key);
    27. Count++;
    28. }
    29. public BSTree(T[] keys) {
    30. if (keys.Length == 0) {
    31. return;
    32. }
    33. Root = new BSTreeNode<T>(keys[0]);
    34. for (int i = 1; i < keys.Length; i++) {
    35. Insert(keys[i]);
    36. }
    37. }
    38. /**
    39. * 插入
    40. **/
    41. public BSTreeNode<T> Insert(T key) {
    42. BSTreeNode<T> node = Root;
    43. BSTreeNode<T> newNode = new BSTreeNode<T>(key);
    44. BSTreeNode<T> parent = null;
    45. while (node != null) {
    46. parent = node;
    47. if (key.CompareTo(node.key) > 0) {
    48. node = node.right;
    49. } else {
    50. node = node.left;
    51. }
    52. }
    53. newNode.parent = parent;
    54. if (parent == null) {
    55. return newNode;
    56. } else if (key.CompareTo(parent.key) > 0) {
    57. parent.right = newNode;
    58. } else {
    59. parent.left = newNode;
    60. }
    61. Count++;
    62. return newNode;
    63. }
    64. /**
    65. * 递归遍历
    66. * */
    67. public void Walk(BSTreeNode<T> node, Action<BSTreeNode<T>> func, string type = "mid") {
    68. if (node != null) {
    69. if (type == "pre") func(node);
    70. Walk(node.left, func, type);
    71. if (type == "mid") func(node);
    72. Walk(node.right, func, type);
    73. if (type == "post") func(node);
    74. }
    75. }
    76. /**
    77. * 非递归 中序遍历
    78. * **/
    79. public void InOrderTreeWalk(BSTreeNode<T> root, Action<BSTreeNode<T>> func) {
    80. if (root == null) {
    81. return;
    82. }
    83. Stack<BSTreeNode<T>> stack = new Stack<BSTreeNode<T>>((int)(2 * Math.Log(Count + 1)));
    84. BSTreeNode<T> current = root;
    85. while (current != null) {
    86. stack.Push(current);
    87. current = current.left;
    88. }
    89. while (stack.Count != 0) {
    90. current = stack.Pop();
    91. func(current);
    92. BSTreeNode<T> node = current.right;
    93. while (node != null) {
    94. stack.Push(node);
    95. node = node.left;
    96. }
    97. }
    98. }
    99. /**
    100. * 搜索
    101. * **/
    102. public BSTreeNode<T> Search(BSTreeNode<T> node, T key) {
    103. while (node != null && key.CompareTo(node.key) != 0) {
    104. if (key.CompareTo(node.key) < 0) {
    105. node = node.left;
    106. } else {
    107. node = node.right;
    108. }
    109. }
    110. return node;
    111. }
    112. /**
    113. * 最小值
    114. * **/
    115. public BSTreeNode<T> Min(BSTreeNode<T> node) {
    116. while (node != null && node.left != null) {
    117. node = node.left;
    118. }
    119. return node;
    120. }
    121. /**
    122. * 最大值
    123. * **/
    124. public BSTreeNode<T> Max(BSTreeNode<T> node) {
    125. while (node != null && node.right != null) {
    126. node = node.right;
    127. }
    128. return node;
    129. }
    130. /**
    131. * 后继元素
    132. * **/
    133. public BSTreeNode<T> Succ(BSTreeNode<T> node) {
    134. if (node.right != null) {
    135. return Min(node.right);
    136. }
    137. BSTreeNode<T> parent = node.parent;
    138. while (parent != null && node != parent.left) {
    139. node = parent;
    140. parent = node.parent;
    141. }
    142. return parent;
    143. }
    144. /**
    145. * 前驱元素
    146. * **/
    147. public BSTreeNode<T> Pred(BSTreeNode<T> node) {
    148. if (node.left != null) {
    149. return Max(node.left);
    150. }
    151. BSTreeNode<T> parent = node.parent;
    152. while (parent != null && node != parent.right) {
    153. node = parent;
    154. parent = node.parent;
    155. }
    156. return parent;
    157. }
    158. /**
    159. * 删除节点
    160. * */
    161. public BSTreeNode<T> Delete(BSTreeNode<T> t ,BSTreeNode<T> x) {
    162. if (x == null) return Root;
    163. BSTreeNode<T> root = t;
    164. BSTreeNode<T> oldX= x;
    165. BSTreeNode<T> parent = x.parent;
    166. if (x.left == null) {
    167. x = x.right;
    168. } else if (x.right == null) {
    169. x = x.left;
    170. } else {
    171. BSTreeNode<T> y = Min(x.right);
    172. x.key = y.key;
    173. if (y.parent != x) {
    174. y.parent.left = y.right;
    175. } else {
    176. x.right = y.right;
    177. }
    178. return root;
    179. }
    180. if (x != null) {
    181. x.parent = parent;
    182. }
    183. if (parent == null) {
    184. root = x;
    185. } else {
    186. if (parent.left == oldX) {
    187. parent.left = x;
    188. } else {
    189. parent.right = x;
    190. }
    191. }
    192. return Root;
    193. }
    194. public List<T> ToList() {
    195. List<T> list = new List<T>();
    196. Walk(Root, (BSTreeNode<T> node) => {
    197. list.Add(node.key);
    198. }, "mid");
    199. return list;
    200. }
    201. }
    202. }





  • 相关阅读:
    TensorFlow 学习(4)——MNIST机器学习进阶
    TensorFlow 学习(3)——MNIST机器学习入门
    TensorFlow 学习(2)——正式起步
    TensorFlow 学习(1)——第一个程序:线性回归
    OpenCV学习笔记(15)——更多的轮廓函数
    OpenCV学习笔记(14)——轮廓的性质
    OpenCV学习笔记(13)——轮廓特征
    OpenCV学习笔记(12)——OpenCV中的轮廓
    机器学习
    机器学习- Attention Model结构解释及其应用
  • 原文地址:https://www.cnblogs.com/xiejunzhao/p/7fead2a30b116abdf516ae053cd93ab6.html
Copyright © 2011-2022 走看看