欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现二叉排序树代码实例

程序员文章站 2023-12-05 21:47:28
二叉排序树,又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树: 若它的左子树不为空。则左子树上所有的结点的值均小于跟的结点值 若它的右子树部位...

二叉排序树,又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:

  • 若它的左子树不为空。则左子树上所有的结点的值均小于跟的结点值
  • 若它的右子树部位空,则右子树的所有结点值均大于它的根结点的值
  • 它的左右子树也分别是二叉排序树

1,排序方便
2,查找方便
3,便于插入和删除

C#实现二叉排序树代码实例

c#链式存储二叉排序树,实现简单的排序,以及查找,具体代码如下:

namespace _2_1_3二叉排序树
{
  /// <summary>
  /// 结点类
  /// </summary>
  class bsnode
  {
    //结点
    public bsnode leftchild { get; set; }
    public bsnode rightchild { get; set; }
    public bsnode parent { get; set; }
    public int data { get; set; }
    // 构造方法
    public bsnode(){}
    public bsnode(int item)
    {
      this.data = item;
    }
  }
}
using system;
namespace _2_1_3二叉排序树
{
  /// <summary>
  /// 二叉排序树
  /// </summary>
  class bstree
  {
    bsnode root = null;
    /// <summary>
    /// 添加数据
    /// </summary>
    public void add(int item)
    {
      //创建新结点
      bsnode newnode = new bsnode(item);
      if (root == null)     //若为空,则创建为根结点
      {
        root = newnode;
      }
      else
      {
        bsnode temp = root;
        while (true)
        {
          if (item >= temp.data) //放在temp结点的右边
          {
            if (temp.rightchild == null)
            {
              temp.rightchild = newnode;
              newnode.parent = temp;
              break;
            }
            else
            {
              temp = temp.rightchild;
            }
          }
          else          //放在temp结点的左边
          {
            if (temp.leftchild == null)
            {
              temp.leftchild = newnode;
              newnode.parent = temp;
              break;
            }
            else
            {
              temp = temp.leftchild;
            }
          }
        }
      }
    }
    /// <summary>
    /// 中序遍历二叉树
    /// </summary>
    public void middlebianli()
    {
      middlebianli(root);
    }
    //递归方式中序遍历树
    private void middlebianli(bsnode node)
    {
      if (node == null) return;
      middlebianli(node.leftchild);
      console.write(node.data + " ");
      middlebianli(node.rightchild);
    }
    /// <summary>
    ///查找方法-1
    /// </summary>
    public bool find1(int item)
    {
      return find(item, root);
    }
    private bool find(int item, bsnode node)
    {
      if (node == null) { return false; }
      if (node.data == item)
      {
        return true;
      }
      else
      {
        //利用二叉排序树的便利
        if (item > node.data)
        {
          return find(item, node.rightchild);
        }
        else
        {
          return find(item, node.leftchild);
        }
      }
    }
    /// <summary>
    /// 查找方法-2
    /// </summary>
    /// <param name="item"></param>
    /// <returns></returns>
    public bool find2(int item)
    {
      bsnode temp = root;
      while (true)
      {
        if (temp == null) return false;
        if (temp.data == item) return true;
        if (item > temp.data)
        {
          temp = temp.rightchild;
        }
        else
        {
          temp = temp.leftchild;
        }
      }
    }
    public bool delete(int item)
    {
      bsnode temp = root;
      while (true)
      {
        if (temp == null) return false;
        if (temp.data == item)
        {
          delete(temp);
          return true;
        }
        if (item > temp.data)
        {
          temp = temp.rightchild;
        }
        else
        {
          temp = temp.leftchild;
        }
      }
    }
    public void delete(bsnode node)
    {
      //叶子结点,即无子树情况
      if (node.leftchild == null && node.rightchild == null)
      {
        if (node.parent == null)
        {
          root = null;
        }
        else if (node.parent.leftchild == node)
        {
          node.parent.leftchild = null;
        }
        else if (node.parent.rightchild == node)
        {
          node.parent.rightchild = null;
        }
        return;
      }
      //只有右子树的情况
      if (node.leftchild == null && node.rightchild != null)
      {
        node.data = node.rightchild.data;
        node.rightchild = null;
        return;
      }
      //只有左子树的情况
      if (node.leftchild != null && node.rightchild == null)
      {
        node.data = node.leftchild.data;
        node.leftchild = null;
        return;
      }
      //删除的结点有左,右子树
      bsnode temp = node.rightchild;
      while (true)
      {
        if (temp.leftchild != null)
        {
          temp = temp.leftchild;
        }
        else
        {
          break;
        }
      }
      node.data = temp.data;
      delete(temp);
    }
  }
}
using system;
namespace _2_1_3二叉排序树
{
  /// <summary>
  /// 测试类
  /// </summary>
  class program
  {
    static void main(string[] args)
    {
      bstree tree = new bstree();
      int[] data = {62,58,28,47,73,99,35,51,93,37 };

      foreach (int item in data)
      {
        tree.add(item);
      }
      console.write("中序遍历的结果:");
      tree.middlebianli();
      console.writeline();
      console.writeline("find-1方法查找62是否存在:" + tree.find1(62));
      console.writeline("find-2方法查找62是否存在:" + tree.find2(62));
      console.writeline("find-1方法查找63是否存在:" + tree.find1(63)); 
      console.writeline("find-2方法查找63是否存在:" + tree.find2(63));
      console.writeline("删除根结点后的结果:");
      tree.delete(62);
      tree.middlebianli();
      console.readkey();
    }
  }
}

C#实现二叉排序树代码实例

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接