目录
一、涉及到的知识点
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
*/