首先,我们要定义节点数据结构,在这个结构里,包含有三个节点:父节点,左右孩子,节点值。结构如下:
typedef struct _TREE_NODE
{
int data;
struct _TREE_NODE* parent;
struct _TREE_NODE* left_child;
struct _TREE_NODE* right_child;
}TREE_NODE;
1)创建二叉树节点
根据上面的数据结构,我们看到每一个数据节点都有三个指针,分别是:指向父母的指针,指向左孩子的指针,指向右孩子的指针。每一个节点都是通过指针相互连接的。相连指针的关系都是父子关系。那么排序二叉树又是什么意思呢?其实很简单,只要在二叉树的基本定义上增加两个基本条件就可以了:(1)所有左子树的节点数值都小于此节点的数值;(2)所有右节点的数值都大于此节点的数值。
既然看到了节点的定义,那么我们并可以得到,只要按照一定的顺序遍历,可以把二叉树中的节点按照某一个顺序打印出来。那么,节点的创建、查找、遍历是怎么进行的呢,二叉树的高度应该怎么计算呢?我们一一道来。
TREE_NODE* create_tree_node(int data)
{
TREE_NODE* pTreeNode = NULL;
pTreeNode = (TREE_NODE*)malloc(sizeof(TREE_NODE));
assert(NULL != pTreeNode);
memset(pTreeNode, 0, sizeof(TREE_NODE));
pTreeNode->data = data;
return pTreeNode;
}
分析:我们看到,二叉树节点的创建和我们看到的链表节点、堆栈节点创建没有什么本质的区别。首先需要为节点创建内存,然后对内存进行初始化处理。最后将输入参数data输入到tree_node当中即可。
2)数据的查找
TREE_NODE* find_data_in_tree_node(const TREE_NODE* pTreeNode, int data)
{
if(NULL == pTreeNode)
return NULL;
if(data == pTreeNode->data)
return (TREE_NODE*)pTreeNode;
else if(data < pTreeNode->data)
return find_data_in_tree_node(pTreeNode->left_child, data);
else
return find_data_in_tree_node(pTreeNode->right_child, data);
}
分析:我们的查找是按照递归迭代进行的。因为整个二叉树是一个排序二叉树,所以我们的数据只需要和每一个节点依次比较就可以了,如果数值比节点数据小,那么向左继续遍历;反之向右继续遍历。如果遍历下去遇到了NULL指针,只能说明当前的数据在二叉树中还不存在。
3)数据统计
int count_node_number_in_tree(const TREE_NODE* pTreeNode)
{
if(NULL == pTreeNode)
return 0;
return 1 + count_node_number_in_tree(pTreeNode->left_child)
+ count_node_number_in_tree(pTreeNode->right_child);
}
分析:和上面查找数据一样,统计的工作也比较简单。如果是节点指针,那么直接返回0即可,否则就需要分别统计左节点树的节点个数、右节点树的节点个数,这样所有的节点总数加起来就可以了。
4)按照从小到大的顺序打印节点的数据
void print_all_node_data(const TREE_NODE* pTreeNode)
{
if(pTreeNode){
print_all_node_data(pTreeNode->left_child);
printf("%d\n", pTreeNode->data);
print_all_node_data(pTreeNode->right_child);
}
}
分析:因为二叉树本身的特殊性,按顺序打印二叉树的函数本身也比较简单。首先打印左子树的节点,然后打印本节点的数值,最后打印右子树节点的数值,这样所有节点的数值就都可以打印出来了。
5)统计树的高度
int calculate_height_of_tree(const TREE_NODE* pTreeNode)
{
int left, right;
if(NULL == pTreeNode)
return 0;
left = calculate_height_of_tree(pTreeNode->left_child);
right = calculate_height_of_tree(pTreeNode->right_child);
return (left > right) ? (left + 1) : (right + 1);
}
总结:
1)二叉树是所有树的基础,后续的平衡二叉树、线性二叉树、红黑树、复合二叉树、b树、b+树都以此为基础,希望大家好好学习;
2)二叉树很多的操作是和堆栈紧密联系在一起的,如果大家暂时理解不了递归,可以用循环或者堆栈代替;
分享到:
相关推荐
### 排序二叉树的建立与遍历详解 #### 一、概念解析 排序二叉树(Binary Search Tree,简称BST),是一种特殊的二叉树数据结构,其中每个节点具有以下特性: - 节点的左子树上所有节点的值均小于它的根节点的值; -...
### Java基础数据结构—排序二叉树 #### 排序二叉树定义 排序二叉树(也称为二叉搜索树或BST),是一种特殊的二叉树数据结构,它具有以下特性: 1. **节点的数据**:每个节点所含有的数据都是可比较的。 2. **根...
我自己写的排序二叉树,使用模板,经过g++正确编译
在这个“C++排序二叉树模板”中,我们将会探讨二叉树的基本概念、常用操作以及如何在C++中实现这些操作。 首先,我们要了解二叉排序树(Binary Search Tree,BST)。这是一种特殊的二叉树,其中每个节点的值都大于...
根据给定的文件信息,我们可以总结出以下关于“哈夫曼编码”与“排序二叉树”的相关知识点。 ### 哈夫曼编码 #### 定义 哈夫曼编码是一种广泛使用的数据压缩方法,其核心思想是通过构建一棵哈夫曼树来实现对数据的...
在计算机科学中,排序二叉树(Sorted Binary Tree)是一种特殊的二叉树数据结构,它满足以下特性:每个节点的左子树上所有节点的值都小于当前节点的值,而右子树上所有节点的值都大于当前节点的值。这种特性使得排序...
根据给定的文件信息,我们可以总结出以下关于“排序二叉树”的相关知识点: ### 排序二叉树(Binary Search Tree, BST)简介 排序二叉树是一种特殊的二叉树,它具有以下特点: - 每个节点包含一个关键字(本例中的...
平衡排序二叉树是一种特殊的二叉树数据结构,其主要目的是在插入和删除节点时保持树的平衡,以确保在动态查找表中的高效性能。本文将详细讲解平衡排序二叉树的C++实现,特别是如何处理插入和删除操作时的平衡化问题...
排序二叉树是一种特殊类型的二叉树,它在数据结构中扮演着重要角色,特别是在需要快速查找、插入和删除操作的场景下。MFC(Microsoft Foundation Classes)是微软提供的C++库,用于构建Windows应用程序的用户界面,...
【Java基础复习笔记10数据结构-排序二叉树】 排序二叉树是一种特殊类型的二叉树,其每个节点的数据值满足以下特性:对于任意节点,其左子树中的所有节点值都小于该节点,而右子树中的所有节点值都大于或等于该节点...
排序二叉树,又称有序二叉树或二叉搜索树,是一种二叉树,其特性是左子树上所有节点的值都小于父节点的值,而右子树上所有节点的值都大于父节点的值。这种结构使得排序二叉树在查找、插入和删除操作上具有较高的效率...
**排序二叉树详解** 排序二叉树,也被称为有序二叉树,是二叉树数据结构的一个特殊类型。在排序二叉树中,每个节点的左子树只包含小于当前节点值的节点,而右子树则包含大于当前节点值的节点。这种特性使得排序...
排序二叉树的应用数据结构课程设计报告 排序二叉树是一种重要的数据结构,它广泛应用于计算机科学和软件工程领域中。在本报告中,我们将详细介绍排序二叉树的应用、设计和实现。 一、设计任务 在设计排序二叉树时...
本代码涵盖二叉查找树的创建,插入,删除,添加,遍历等操作,结合http://blog.csdn.net/wenqian1991/article/details/18228309 可理解
【排序二叉树的应用】 排序二叉树,也称为有序二叉树,是一种特殊类型的二叉树,其中每个节点的左子树只包含小于当前节点的元素,而右子树包含大于当前节点的元素。这样的数据结构使得排序二叉树在插入、删除和查找...
根据给定的文件信息,我们可以总结出以下关于“排序二叉树&平衡树”的相关知识点,尤其是通过C语言实现的角度: ### 排序二叉树(Binary Search Tree, BST) #### 定义与结构 排序二叉树是一种特殊的二叉树,其中...
二叉排序树的建立基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip
MFC 排序二叉树实验.pdf