二叉树排序

原创 2017年01月03日 16:05:57

1、二叉树排序

--1)一个无序整数数组

--2)创建二叉树,数组第一个元素为根结点,数组中下一个元素小于根的值放左边,大于的放右边。

--3)中序遍历,结果即为数组从小到大的排序。

当n较大时,用快速排序、堆排序或归并排序。

当待排序的关键字是随机分布时,快速排序的平均时间最短。堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。

堆排序和快速排序都是不稳定的。

若要求排序稳定,可选用归并排序。但从单个记录起进行两两归并的排序算法并不值得提倡。通常可以将它和直接插入排序结合在一起使用。

稳定排序:直接插入排序、冒泡排序、归并排序

不稳定:堆排序、快速排序、希尔排序、选择排序

2、代码实现

#include <iostream>
using namespace std;
#define dim(x) (sizeof(x)/sizeof(x[0]))

void swap(int *x,int *y)
{
	int t = *x;
	*x = *y;
	*y = t;
}
//定义二叉树结构体
struct NODE
{
	int iData;
	NODE *pLChild;
	NODE *pRChild;
};
//中序遍历
void InOrder(NODE *node)
{
	if(node == NULL) return;
	InOrder(node->pLChild);
	printf("%d ",node->iData);
	InOrder(node->pRChild);
}
//创建二叉树
NODE * TreeSort(const int sz[],const int nLen)
{
	//先创建好所有结点
	NODE *tree = new NODE[nLen];
	for(int i=0;i<nLen;i++)
	{
		tree[i].iData = sz[i];
		tree[i].pLChild = NULL;
		tree[i].pRChild = NULL;
	}
	//根据规则,建立结点间的关系
	NODE *pRoot = &tree[0]; //根结点选择数组第一个元素
	for(int i=1;i<nLen;i++)
	{
		NODE *pCur = pRoot;
		bool bGo = true; //控制跳出循环的
		while(bGo)
		{
			//判断新加入的结点是不是比当前节点小
			while(tree[i].iData <= pCur->iData)
			{
				if(pCur->pLChild == NULL)
				{
					pCur->pLChild = &tree[i];
					bGo = false;
					break;
				}
				pCur = pCur->pLChild;
			}
			//判断新加入的结点是不是比当前节点大
			while(tree[i].iData > pCur->iData)
			{
				if(pCur->pRChild == NULL)
				{
					pCur->pRChild = &tree[i];
					bGo = false;
					break;
				}
				pCur = pCur->pRChild;
			}
		}
	}
	return pRoot;
}

void main()
{
	int a[] = {49,38,65,97,76,13,27};
	NODE *pRoot = TreeSort(a,dim(a));
	InOrder(pRoot);
	printf("\n");
	delete pRoot;
	system("pause");
}

输出:

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉树排序原理

/*比较器的排序原理--->二叉树排序原理   原理:将第一个内容作为根节点保存,之后如果后面的值比根节点的值小,则放在根节点的左子树         如果后面的值比根节点大,则放在根节点的右子树...
  • lm16875
  • lm16875
  • 2013年04月11日 23:23
  • 1095

java二叉树排序算法

排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的:排序二叉树的3个特征:1:当前node的所有左孩子的值都小于当前node的值;2:当前node的所有右孩子的值都大于当前nod...
  • sunxing007
  • sunxing007
  • 2009年07月17日 13:29
  • 14899

八大排序算法 之 堆排序(二叉树排序)

例如数组 a={19,3,60,7,1,15,33,24,45,32,79,85}; 排序思想: 1,堆排序也是选择排序的一种,根据堆得特性,每次把最大或最小值(本次以最大值为例)拿出来,按序排列; ...
  • yxb_yingu
  • yxb_yingu
  • 2016年05月07日 10:03
  • 9962

C语言:利用排序二叉树进行排序

C语言:利用排序二叉树进行排序标签: C语言 二叉树 排序by 小威威1.引入排序二叉树属于二叉树的一种,其主要特色在于构建二叉树与输出二叉树。二叉树的子树很有特点:左子树小于根结点,根结点小于右...
  • linwh8
  • linwh8
  • 2016年01月07日 00:27
  • 1823

Java实现二叉树和常见的排序

前言这里总结对二叉树和排序做一下笔记,记不清的时候可以翻来看看。二叉树二叉树分为根节点,双亲节点,叶子节点,节点的度不能超多2,左孩子小于双亲节点,右孩子大于双亲节点。public class Tre...
  • qq_22271479
  • qq_22271479
  • 2017年07月06日 14:21
  • 589

js javascript 二叉树排序方法

不是本人原创,来自网络,仅仅整理了下使用方法:第一步:加入以下js代码第二步:定义数组 例如 var arr=[9,8,7,6,5,4,3,2,1,0];第三步:执行 arr.treeSort();此...
  • lsf5921
  • lsf5921
  • 2011年03月17日 17:59
  • 3484

数据结构(C++)——排序二叉树(二叉搜索树)

二叉搜索树也称为二叉排序树。也就是说,插入的第一个数据作为根节点,后来的结点跟其根结点比,小的插在左边,大的插在右边。下面给举个例子: 由45,60 ,30 ,20 ,25 ,55 ,65 ,50,...
  • weixin_35909255
  • weixin_35909255
  • 2017年02月12日 14:05
  • 447

二叉树的层排序

根节点入队; while(队列不为空)、 { 队首元素出列; 有左孩子则入队; 有右孩子则入队; }...
  • qq_27276833
  • qq_27276833
  • 2017年11月21日 20:26
  • 29

排序二叉树及其Java实现

定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值; (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值; (...
  • bruce_6
  • bruce_6
  • 2014年08月18日 16:30
  • 3960

通过二叉树形式给一个数组排序

/*  *通过二叉树形式给一个数组排序  *1.创建对应的二叉树模型  *2.把数组以怎样的形式放入到模型里面  *3.把数组以怎样的形态给取出来  *4.获取数组的根节点   * 5.测...
  • hkawei
  • hkawei
  • 2017年06月09日 09:52
  • 134
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树排序
举报原因:
原因补充:

(最多只允许输入30个字)