C#使用自定义的节点类Node(int data)实现二叉树类BinaryTree及其方法

本文详细介绍了树结构、特别是二叉树的概念、定义、特点以及基本操作,包括二叉搜索树的性质。通过实例展示了如何在C#中实现二叉树并进行节点添加和遍历。
摘要由CSDN通过智能技术生成

目录

一、涉及到的知识点

1.树结构

2.树结构的数据类型定义

(1)结构定义

(2)基本操作

3.二叉树

(1)定义和特点

(2)遍历二叉树的输出结果

二 、二叉树的实例


一、涉及到的知识点

1.树结构

        树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。直观来看,树是以分支关系定义的层次结构。 

2.树结构的数据类型定义

        包含树的结构定义和基本操作

(1)结构定义

  • 树是n(n≥1)个节点的有限集,在任意一棵非空树中,都应该符合以下条件:有且仅有一个特定的节点称为根的节点。
  • 当n>1时,其余节点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。

(2)基本操作

        树的基本操作主要包括构造空树、销毁树、清空树、求树的深度、访问节点、插入子树和删除子树等。

3.二叉树

(1)定义和特点

        二叉树是一种特殊的树形数据结构,它的每个节点最多有两个子节点,通常分为左子节点和右子节点。下面是二叉树的一些特点:

  • 二叉树的每个节点最多有两个子节点,不存在超过两个子节点的情况。
  • 二叉树的根节点没有父节点。
  • 二叉树中每个节点的左子树的所有节点值都小于该节点的值,右子树的所有节点值都大于该节点的值。这是二叉搜索树(Binary Search Tree)的特性。
  • 二叉树的深度为1,只有一个根节点时;深度为2,有根节点和一个子节点时;深度为3,有根节点和两个子节点时,等等。
  • 二叉树可以为空,即没有根节点。
  • 二叉树的节点可以存储数据,也可以是空的(即不含数据)。
  • 二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。这三种遍历方式分别以不同的顺序访问二叉树的节点。

        二叉树在计算机科学中有广泛的应用,例如:二叉搜索树、堆、红黑树等。它们在数据存储、搜索和排序等方面具有很高的效率。

(2)遍历二叉树的输出结果

        例如,对二叉树添加了节点:6,4,8,3,5,7,9。遍历输出各节点,显示的结果是:3,4,5,6,7,8,9。这貌似被排序后输出的。其实,看到的输出结果是由于二叉搜索树的性质决定的。二叉搜索树是一种特殊的二叉树,它的每个节点都满足以下条件:

  • 左子树中所有节点的值都小于当前节点的值。
  • 右子树中所有节点的值都大于当前节点的值。

        因此,当按照顺序插入节点时(例如:6,4,8,3,5,7,9),二叉搜索树会自动按照顺序排列这些节点。遍历二叉搜索树时,当然九按照顺序输出这些节点。

        所以看到的输出结果是由于二叉搜索树的性质和遍历方式导致的,而不是由于排序算法。

二 、二叉树的实例

// 二叉树类及其方法

namespace _135_2
{
    public class Node(int data)
    {
        public int? Data = data;
        public Node? Left = null;
        public Node? Right = null;
    }

    public class BinaryTree
    {
        private Node? root;
        //public Node? Root { get; private set; }
        public Node? Root
        {
            get
            {
                return root;
            }
        }
        public BinaryTree()
        {
            root = null;
        }

        public void AddNode(int data)
        {
            root = AddNodeRec(root!, data);
        }

        private static Node AddNodeRec(Node node, int data)
        {
            if (node == null)
            {
                return new Node(data);
            }

            if (data < node.Data)
            {
                node.Left = AddNodeRec(node.Left!, data);
            }
            else if (data > node.Data)
            {
                node.Right = AddNodeRec(node.Right!, data);
            }

            return node;
        }

        //public static void PrintTree(Node node)
        //{
        //    if (node != null)
        //    {
        //        PrintTree(node.Left!);
        //        Console.WriteLine(node.Data);
        //        PrintTree(node.Right!);
        //    }
        //}
    }

    class Program
    {
        static void Main(string[] args)
        {
            ArgumentNullException.ThrowIfNull(args);

            BinaryTree tree = new();
            tree.AddNode(6);
            tree.AddNode(4);
            tree.AddNode(8);
            tree.AddNode(3);
            tree.AddNode(5);
            tree.AddNode(7);
            tree.AddNode(9);

            Console.WriteLine("二叉搜索树中的节点:");
            /*BinaryTree.*/PrintTree(tree.Root!);

            Console.ReadKey();
        }

        static void PrintTree(Node node)
        {
            if (node != null)
            {
                PrintTree(node.Left!);
                Console.WriteLine(node.Data);
                PrintTree(node.Right!);
            }
        }
    }
}
//
/*
二叉搜索树中的节点:
3
4
5
6
7
8
9
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值