二叉查找树(二叉排序树)创建 C/C++_c++创建一颗二叉排序树,实现二叉排序树查找算法。-程序员宅基地

技术标签: # 数据结构  C/C++  C++  二叉树  数据结构  

一棵空树,或者是具有下列性质的二叉树:

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

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

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

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

说白了就是无论是对整棵树还是其某棵子树,左子树的节点都比根节点小,右子树的节点都比根节点大

#include<stdio.h>
#include<stdlib.h>

typedef struct BinarySortTreeNode
{
	int data;								//数据域
	struct BinarySortTreeNode *lChild;		//左子树
	struct BinarySortTreeNode *rChild;		//右子树
}BSTNode;

/**
insertBSTNode()  插入节点
	node:树节点,须使用指针的引用(如果是C语言也可以用二级指针),意图修改地址
	element:节点数据域值
**/
void insertBSTNode(BSTNode * &node, int element)  
{
	if (NULL == node)
	{
		node = new BSTNode;
		node->data = element;
		node->lChild = NULL;
		node->rChild = NULL;
		return;
	}

	if (node->data == element)  // 不允许两个相同值的节点
	{
		return;
	}

	if (element < node->data)
	{
		insertBSTNode(node->lChild, element);
	}
	if (element > node->data)
	{
		insertBSTNode(node->rChild, element);
	}
	
}

void preOrder(BSTNode *root)	// 先序遍历
{
	if (root)
	{
		printf("%d  ", root->data);
		preOrder(root->lChild);
		preOrder(root->rChild);
	}
}

void inOrder(BSTNode *root)		// 中序遍历
{
	if (root)
	{
		inOrder(root->lChild);
		printf("%d  ", root->data);
		inOrder(root->rChild);
	}
}

void initBST(BSTNode *&root, int ele[], int len)	//创建二叉查找树,也要使用指针的引用
{
	if (NULL == ele || 0 == len)
	{
		return;
	}

	for (int i = 0; i < len; i++)
	{
		insertBSTNode(root, ele[i]);
	}
}

void freeTree(BSTNode *&root) //释放节点
{
	if (NULL == root)
	{
		return;
	}

	freeTree(root->lChild);
	freeTree(root->lChild);
	delete root;
	root = NULL;
}

int main()
{
	int ele[] = { 5,3,8,7,2,9,1,10,6,4 };
	int len = sizeof(ele) / sizeof(ele[0]);
	BSTNode *root = NULL;

	initBST(root,ele,len);
	printf("先序遍历:DLR:根左右:");
	preOrder(root);
	printf("\n中序遍历:LDR:左根右:");
	inOrder(root);
	printf("\n");
	freeTree(root);

	system("pause");
	return 0;
}

运行结果:

根据中序遍历和任一遍历,可以画出唯一的二叉树,方式就不提了。

可以看出:

先序遍历:5 3 2 1 4 8 7 6 9 10
中序遍历:1 2 3 4 5 6 7 8 9 10
后序遍历:1 2 4 3 6 7 10 9 8 5

这棵树也是一棵二叉排序树。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/feel_myself_is_lowB/article/details/108347389

智能推荐

对计算机pep介绍正确的是,2018级计算机科学技术导论-程序员宅基地

文章浏览阅读331次。跳至...新闻发布区最新通知课程APP(安卓端)资源导航教学大纲教学日历中文参考教材课程内容分布主讲教师简介参考书目与学习网站Tell me about your expectations for the course.学习目标计算机科学导论KeywordsChapter 1 The Big Picture PPT1.Grouping your group then make a discussi..._photograph compression for web usage or email

2020年面向iOS开发的知识点总结(持续更新中)_ios2020年度总结-程序员宅基地

文章浏览阅读334次。前言:最近在整理自己的技术栈,收集了一些自己认为比较重要的知识点分享给大家。Runloop1.iOS中触摸事件传递和响应原理2.为什么只有主线程的runloop是开启的3.为什么只在主线程刷新UI4.PerformSelector和runloop的关系5.GCD 在Runloop中的使用?6.AFNetworking 中如何运用 Runloop?Runtime1.Category 的实现原理?2.isa指针的理解,对象的isa指针指向哪里?isa指针有哪两种类型?3.Objectiv_ios2020年度总结

Java基础进阶提升_java 进阶提升-程序员宅基地

文章浏览阅读201次。(一)Java基础面向对象java语法常用类,api数据类型方法、对象、引用运算符、操作符关键字、关键词(二)java进阶8. 异常、异常分类与处理9. 线程同步、守护线程10. 多线程、IO流11. 接口、多继承12. jdk、jre、jvm13. 反射、泛型14. 类继承、方法覆盖(三)数据库15. Mysql数据库16. Oracle数据库17. JDBC18. 存储过程19. 数据库连接池20. JDBC连接池21. Sqlserver数据库(四)_java 进阶提升

【python基础知识】3.input()函数_input函数-程序员宅基地

文章浏览阅读9.8k次,点赞2次,收藏7次。在前面的学习中,我们学会了用print()函数对计算机下简单的命令,开始接触Python里不同类型的数据,并且懂得用if条件判断语句实现与计算机沟通的初级逻辑。经过了这些学习,你是不是对Python的了解又近了一步?有没有开始觉得,过去冷冰冰的计算机似乎在和你的沟通下,也变得亲切了起来。但是,仅仅掌握Python的码法是不够的。要想走得更远,我们一定要掌握Python的代码逻辑,利用正确的【数据】和合理的【逻辑】构造命令,最后还需【回应】计算机,【输入】自己的信息,就是要用到input()函数。_input函数

centos7无线网络设置-程序员宅基地

文章浏览阅读1.1w次。1、查看笔记本WiFi网卡名称:ip addr[root@localhost ~]# ip addr1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0..._centos7无线网络设置

条件随机场专题(2)--CRF模型_crf能处理时序信息的模型-程序员宅基地

文章浏览阅读882次。CRF是一种典型的判别式模型,它是根据模板,得到相应的特征函数,再通过这些特征函数进行参数的优化计算,那么在介绍CRF模型前,就有必要先介绍判别式模型和生成式模型。_crf能处理时序信息的模型

随便推点

antd protable 的一些配置记录_protable scroll-程序员宅基地

文章浏览阅读1.1k次。antd protable_protable scroll

清理node缓存,卸载angular以及强制删除angular的方法_彻底删除angular-程序员宅基地

文章浏览阅读8k次,点赞3次,收藏9次。卸载angular的两种方案_彻底删除angular

ios 设备型号_device version 10,1-程序员宅基地

文章浏览阅读1.2w次。1234567891011//可通过苹果review+ (NSString*)getDeviceVersion{ size_t size; sysctlbyname("hw.machine",NULL, &size, NULL, 0); char*machine = (char*)malloc(siz_device version 10,1

html标签使用时特别注意,JavaScript怎么修改HTML标签属性-程序员宅基地

文章浏览阅读866次。javascript修改属性的方法:首先使用getElementById()、getElementsByName()或getElementsByTagName()获取到DOM对象;然后使用“DOM对象.属性名=值;”来修改属性即可。本教程操作环境:windows7系统、ECMAScript 5版、Dell G3电脑。HTML DOM 对象从 JavaScript 的观点来看,网页上的每个 HTML..._修改标签属性

bat定时执行php,Linux_用bat实现定时执行任务的批处理文件,@echo off set txt1=%date:~0,4% ::当前 - phpStudy...-程序员宅基地

文章浏览阅读167次。用bat实现定时执行任务的批处理文件@echo offset txt1=%date:~0,4%::当前年set txt2=%date:~5,2%::当前月set txt3=%date:~8,2%::当前日set txt4=%time:~0,2%::当前小时set txt5=%time:~3,2%::当前分钟set txt6=%time:~6,2%::当前秒set date=%txt1%%txt2%..._定时任务的bat 文件能用echo 吗?

android微信朋友圈分享_andorid 微信fenxiang-程序员宅基地

文章浏览阅读1k次。android 微信朋友圈分享开发步骤_andorid 微信fenxiang