记录数据结构的练习
强调:线程不安全
本文在学习之初,有参考其他博客内容,链接如下:
https://www.cnblogs.com/hongwei8455/p/3658574.html
经过自己的理解,重构优化后:
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
### 直接上代码
```csharp
using System;
using System.Collections.Generic;
/// <summary>
/// 二叉平衡树
/// #平衡因子:节点的左子树高度-节点的右子树高度
/// #判断节点的平衡与否 就是判断节点的平衡因子的绝对值是否不大于1, 即 -1 0 1 三种情况
/// </summary>
public class BalanceBinaryTree
{
/// <summary>
/// 节点
/// </summary>
public class TreeNode
{
/// <summary>
/// 左子树
/// </summary>
internal TreeNode left;
/// <summary>
/// 右子树
/// </summary>
internal TreeNode right;
/// <summary>
/// 父节点
/// </summary>
internal TreeNode parent;
/// <summary>
/// 数据
/// </summary>
internal int data;
/// <summary>
/// 高度
/// </summary>
public int height;
public TreeNode(TreeNode l, TreeNode r, int d)
{
left = l;
right = r;
data = d;
}
public TreeNode(int d) : this(null, null, d) { }
public TreeNode() : this(null, null, 0) { }
public void SetParent(TreeNode p) { parent = p; }
public void Reset()
{
data = 0;
left = right = parent = null;
}
}
/// <summary>
/// 根节点
/// </summary>
public TreeNode Root => root;
private TreeNode root;
/// <summary>
/// 是否是空树
/// </summary>
public bool IsEmpty => root == null;
/// <summary>
/// 高度
/// </summary>
/// <returns></returns>
public int Height => TreeHeight(root);
/// <summary>
/// 是否是平衡的
/// </summary>
public bool IsBalance => CheckBalance(root);
/// <summary>
/// 树的节点数量
/// </summary>
public int Count => NodeCount(root);
public BalanceBinaryTree(TreeNode r)
{
root = r;
}
public BalanceBinaryTree() : this(null) { }
#region public方法
/// <summary>
/// 插入数据
/// </summary>
/// <param name="num"></param>
public void Insert(int num)
{
if (root == null)
root = new TreeNode(num);
else
{
//平衡方式 1
//插入元素时 检查不平衡元素,同时进行自平衡
//AVL_Insert(ref root, num);
//平衡方式 2
//普通的二叉搜索树插入 不会进行平衡检测 必须与Balance() 配合才能做到树的平衡
Insert(root, num);
//插入完成 进行自平衡校验
Balance();
}
}
/// <summary>
/// 查找数据
/// </summary>
/// <param name="v"></param>
/// <returns></returns>
public TreeNode Search(int v)
{
if (root == null) return null;
return Search(root, v);
}
/// <summary>
/// 使树平衡化
/// </summary>
public void Balance()
{
Balance(ref root);
}
/// <summary>
/// 删除给定数据
/// </summary>
/// <param name="v"></param>
public void DeleteNode(int v)
{
if (root == null) return;
if (root.data == v)
{
//获取的是根节点的右子树中最小值 两种方式均可
//1.找出 右子树最大值
TreeNode temp = MinRightNode(root);
//2.找出左子树最大值
//temp = MaxLeftNode(root);
//没有右节点 根节点设置为
if (temp == null)
{
root = root.left;
}
else
{
DeleteNode(root, false, temp.data);
root.data = temp.data;
}
}
else//判断匹配值和当前节点值的关系ÿ