`
fsplove520
  • 浏览: 28018 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

排序二叉树

 
阅读更多
首先,我们要定义节点数据结构,在这个结构里,包含有三个节点:父节点,左右孩子,节点值。结构如下:
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基础数据结构-排序二叉树

    ### Java基础数据结构—排序二叉树 #### 排序二叉树定义 排序二叉树(也称为二叉搜索树或BST),是一种特殊的二叉树数据结构,它具有以下特性: 1. **节点的数据**:每个节点所含有的数据都是可比较的。 2. **根...

    排序二叉树模板实现

    我自己写的排序二叉树,使用模板,经过g++正确编译

    C++排序二叉树模板

    在这个“C++排序二叉树模板”中,我们将会探讨二叉树的基本概念、常用操作以及如何在C++中实现这些操作。 首先,我们要了解二叉排序树(Binary Search Tree,BST)。这是一种特殊的二叉树,其中每个节点的值都大于...

    数据结构 作业哈夫曼、排序二叉树

    根据给定的文件信息,我们可以总结出以下关于“哈夫曼编码”与“排序二叉树”的相关知识点。 ### 哈夫曼编码 #### 定义 哈夫曼编码是一种广泛使用的数据压缩方法,其核心思想是通过构建一棵哈夫曼树来实现对数据的...

    使用JavaScript实现的排序二叉树.zip

    在计算机科学中,排序二叉树(Sorted Binary Tree)是一种特殊的二叉树数据结构,它满足以下特性:每个节点的左子树上所有节点的值都小于当前节点的值,而右子树上所有节点的值都大于当前节点的值。这种特性使得排序...

    陈斌才---排序二叉树

    根据给定的文件信息,我们可以总结出以下关于“排序二叉树”的相关知识点: ### 排序二叉树(Binary Search Tree, BST)简介 排序二叉树是一种特殊的二叉树,它具有以下特点: - 每个节点包含一个关键字(本例中的...

    平衡排序二叉树的C++算法实现

    平衡排序二叉树是一种特殊的二叉树数据结构,其主要目的是在插入和删除节点时保持树的平衡,以确保在动态查找表中的高效性能。本文将详细讲解平衡排序二叉树的C++实现,特别是如何处理插入和删除操作时的平衡化问题...

    数据结构中用MFC 界面的排序二叉树

    排序二叉树是一种特殊类型的二叉树,它在数据结构中扮演着重要角色,特别是在需要快速查找、插入和删除操作的场景下。MFC(Microsoft Foundation Classes)是微软提供的C++库,用于构建Windows应用程序的用户界面,...

    Java基础复习笔记10数据结构-排序二叉树

    【Java基础复习笔记10数据结构-排序二叉树】 排序二叉树是一种特殊类型的二叉树,其每个节点的数据值满足以下特性:对于任意节点,其左子树中的所有节点值都小于该节点,而右子树中的所有节点值都大于或等于该节点...

    排序二叉树前序中序后序遍历

    排序二叉树,又称有序二叉树或二叉搜索树,是一种二叉树,其特性是左子树上所有节点的值都小于父节点的值,而右子树上所有节点的值都大于父节点的值。这种结构使得排序二叉树在查找、插入和删除操作上具有较高的效率...

    排序二叉树, 数据结构中的hello world

    **排序二叉树详解** 排序二叉树,也被称为有序二叉树,是二叉树数据结构的一个特殊类型。在排序二叉树中,每个节点的左子树只包含小于当前节点值的节点,而右子树则包含大于当前节点值的节点。这种特性使得排序...

    排序二叉树的应用数据结构课程设计报告.doc

    排序二叉树的应用数据结构课程设计报告 排序二叉树是一种重要的数据结构,它广泛应用于计算机科学和软件工程领域中。在本报告中,我们将详细介绍排序二叉树的应用、设计和实现。 一、设计任务 在设计排序二叉树时...

    排序二叉树完整代码

    本代码涵盖二叉查找树的创建,插入,删除,添加,遍历等操作,结合http://blog.csdn.net/wenqian1991/article/details/18228309 可理解

    排序二叉树的应用-数据结构课程设计报告.doc

    【排序二叉树的应用】 排序二叉树,也称为有序二叉树,是一种特殊类型的二叉树,其中每个节点的左子树只包含小于当前节点的元素,而右子树包含大于当前节点的元素。这样的数据结构使得排序二叉树在插入、删除和查找...

    排序二叉树&平衡树

    根据给定的文件信息,我们可以总结出以下关于“排序二叉树&平衡树”的相关知识点,尤其是通过C语言实现的角度: ### 排序二叉树(Binary Search Tree, BST) #### 定义与结构 排序二叉树是一种特殊的二叉树,其中...

    基于JavaScript实现排序二叉树源码.zip

    二叉排序树的建立基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip基于JavaScript实现排序二叉树源码.zip

    MFC 排序二叉树实验.pdf

    MFC 排序二叉树实验.pdf

Global site tag (gtag.js) - Google Analytics