C#数据结构练习——平衡二叉树

本文详细介绍了如何使用C#实现平衡二叉树,包括插入、查找、删除操作,并提供了完整的代码示例。文章通过平衡因子来判断树的平衡状态,确保树的高效性能。
摘要由CSDN通过智能技术生成

记录数据结构的练习
强调:线程不安全

本文在学习之初,有参考其他博客内容,链接如下:
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//判断匹配值和当前节点值的关系ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值