初步学习二叉排序树

1.  二叉排序树的性质如下:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

2.二叉树的实现

(1) 节点的定义:

typedef int KeyType;
typedef struct Node
{
	KeyType		m_data;	//数据成员
	Node		*m_pLChild;//左子树;
	Node		*m_pRChild;//右子树;
	Node		*m_pParent;//父节点;

}BinaryTree, *PBinaryTree;

(2) 创建二叉树节点:

//创建二叉树节点
PBinaryTree createBinaryNode(KeyType key)
{
	PBinaryTree pNode = nullptr;
	pNode = (PBinaryTree)malloc(sizeof(BinaryTree));
	assert(nullptr != pNode);

	memset((void*)pNode, 0, sizeof(BinaryTree));
	pNode->m_data = key;
	return pNode;
}

(3) 插入节点到二叉排序树中:

在已知二叉排序树T中插入节点

1 若T为空则该节点作为根节点;

2 若插入节点值小于当前节点值则插入到左子树中;

3 若插入节点值大于当前节点值则插入到右子树中。

void insertBinaryNode(PBinaryTree * root, KeyType key)
{
	//若为空树,将插入节点作为根节点
	if (nullptr == (*root))
	{
		PBinaryTree pNode = createBinaryNode(key);
		(*root) = pNode;
		return;
	}

	//若key小于当前节点值, 且左子树为空
	if (nullptr == (*root)->m_pLChild && key < (*root)->m_data)
	{
		PBinaryTree pNode = createBinaryNode(key);
		(*root)->m_pLChild = pNode;
		pNode->m_pParent = (*root);
		return;
	}
	//若右子树为空,且key大于当前根节点值
	if (nullptr == (*root)->m_pRChild && key >(*root)->m_data)
	{
		PBinaryTree pNode = createBinaryNode(key);
		(*root)->m_pRChild = pNode;
		pNode->m_pParent = (*root);
		return;
	}

	if (key < (*root)->m_data)
		insertBinaryNode(&(*root)->m_pLChild, key);
	else if (key >(*root)->m_data)
		insertBinaryNode(&(*root)->m_pRChild, key);
	else
		return;
}

(4) 创建二叉排序树:

void createBinarySortTree(PBinaryTree * root, KeyType arr[], int length)
{
	for (int i = 0; i < length; i++)
	{
		insertBinaryNode(root, arr[i]);
	}
}

(5)对二叉排序树进行数据查找:

1若关键字恰好等于当前值,返回该节点;

2若关键字小当前节点值,在左子树中查找;

3若关键字大与当前节点值, 在右子树中查找;

4若不存在,返回空。

PBinaryTree searchNode(PBinaryTree root, KeyType key)
{
	if (nullptr == root)
		return nullptr;

	if (key == root->m_data)
		return root;
	else if (key < root->m_data)
		return searchNode(root->m_pLChild, key);
	else
		return searchNode(root->m_pRChild, key);
}

(6)  统计二叉排序树的非空节点:

对问题进行分割化,即先统计子树的非空节点,当子树非空节点已知后则比知该树的非空节点数

1计算左子树的非空节点数;

2计算右子树的非空节点数;

3计算该树的非空节点数;

int numInBinaryTree(PBinaryTree root)
{
	if (nullptr == root)
		return 0;

	return (1 + numInBinaryTree(root->m_pLChild) +
		numInBinaryTree(root->m_pRChild));
}

(6)获得二叉排序树的高度:

比较左子树和右子树的高度, 若左子树高度大于右子树高度,则该树的高度为左子树高度+1,否则为右子树高度+1。

int heightBinaryTree(PBinaryTree root)
{
	if (nullptr == root)
		return 0;

	int left, right;
	left = heightBinaryTree(root->m_pLChild);
	right = heightBinaryTree(root->m_pRChild);
	return (left > right) ? (left + 1) : (right + 1);
}

(7)中序遍历打印节点值:

//按照升序打印节点
void printBinaryTree(PBinaryTree root)
{
	if (nullptr == root)
		return;
	printBinaryTree(root->m_pLChild);
	cout << root->m_data << " ";
	printBinaryTree(root->m_pRChild);
}

测试:

int main()
{
	PBinaryTree binarySortTree = nullptr;
	int arr[100];
	int len;
	cout << "请输入不重复待排序元素的个数:";
	cin >> len;
	cout << "依次输入待排序元素:";
	for (int i = 0; i < len; i++)
		cin >> arr[i];

	createBinarySortTree(&binarySortTree, arr, len);

	cout << "输出排序结果如下:\n";
	printBinaryTree(binarySortTree);
	cout << endl;
	cout << "二叉排序树总共元素有: " << numInBinaryTree(binarySortTree) << endl;
	cout << "二叉排序树的高度为: " << heightBinaryTree(binarySortTree) << endl;

	return 0;
}

效果:

时间: 2024-11-05 12:21:12

初步学习二叉排序树的相关文章

LinQ的初步学习与总结

嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单啦,下面就全面的总结一下LinQ的其中一部分,LinQ有三部分:LinQ TO Object:LinQ TO SQL ;LinQ TO XML.而在这里我先来总结一下LinQ TO Object的学习吧 一.初步认识LinQ to Object static void Main(string[] a

Jquery Easy UI初步学习(二)datagrid的使用

第一篇学的是做一个管理的外框,接着就是数据datagrid绑定了,这里我用asp.net mvc3来做的,主要就是熟悉属性.方法. 打开easyui的demo 就可以看到如下一段代码: 和上篇一样class="easyui-datagrid", data-options="...",这是一样的,其他我在网上查了查,并做了整理 DataGrid 属性 参数名 类型 描述 默认值 title string Datagrid面板的标题 null iconCls strin

初步学习C++:C++的基本概念

开始学习C++,先从最基本的概念开始,让自己有一个系统的知识概念. 1.对象: 在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体.对象可以认为是:数据+操作(对象所能完成的操作表示它的动态行为,也成为方法). 2.类: 在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,类是对具有相同数据结构和相同操作的一类对象的描述. 3.消息: 在面向对象程序设计中,一个对象向另一个对象发出的请求被称为"消息".当对象接收到发向它的

Java深度历险(三) Maven初步学习

这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 在gxpt中的体现 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子模块来定义. a. 在父目录中分别创建子项目 b. 父项目,通过以下配置,将子项目关联: 如下: <span style="font-size:18px;"

初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require('fs'); 2 var tel = [ 3 "1/2/4/6/a.tpl.html", 4 "1/2/4/7/9/c.tpl.html", 5 "1/3/5/8/b.tpl.html"]; 6 var demo = function (mulu)

状态保持以及AJAX的初步学习

嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项目期,今天下午学习了ajax,这个使用javascript写起来还是蛮麻烦的,嘿嘿,但是使用jquery实现是非常的简单的,不知道是不是由于我刚接触的原因,下面来总结一下今天学习的内容,感觉今天学习的还是很有必要详细总结的,因为在以后的项目中还是经常会使用的. 一.状态保持 1.cookie的添加与

Jquery Easy UI初步学习(三)数据增删改

第二篇只是学了加载用datagrid加载数据,数据的增删改还没有做,今天主要是解决这个问题了. 在做增删改前需要弹出对应窗口,这就需要了解一下EasyUi的弹窗控件. 摘自:http://philoo.cnblogs.com/ 我的理解,就是panel有的属性Window.dialog都有,同时保留自己的扩展属性方法 , 所以主要展示pannel的属性. Pannel 属性 名称 类型 说明 默认值 title string 显示在Panel头部的标题文字. null iconCls strin

实验1 ASP.NET MVC 4 初步学习

1.添加控制器 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller 2.添加视图 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view 3.添加模型 http://www.asp.net/mvc/tutorials/mvc-4/getting-sta

Jquery Easy UI初步学习(一)

Easy UI 1.3.2 以前听说Easy UI很不错,当了一个dome,闲着没事就看了一下,也整理一下为了自己更好的记忆,也希望对象我这样小菜有帮助吧 先从后台管理的主页面开始,如要要做主页需要了解以下几项 data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我们可以对easyui组件的实例化可以完全写入到html中,例如: <div class="easyui-dialog" style="width:400px;