排序算法之二叉树排序【小二大讲堂】

版权声明:本文为博主原创文章,转载请注明出处!!!小二学堂:https://blog.csdn.net/Mirror_w https://blog.csdn.net/Mirror_w/article/details/89421078

小二精选推荐:
算法入门:https://blog.csdn.net/mirror_w/article/category/8856271
小二课堂:https://blog.csdn.net/Mirror_w

入门介绍:

什么是二叉树???

在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至多有2k-1个叶子节点,至多有2k-1个节点。
二叉树是树形结构的一种重要类型,在实际应用中具有十分重要的意义。从许多实际问题中抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能够简单地转换为二叉树形式,而且二叉树的存储结构及其算法都比较简单,因此我们将详细地讨论关于二叉树的存储、运算及应用。
  二叉树(Binary)是n(n≥0)个结点的有限集合,它的每个结点至多只有两棵子树。它或是空集,或是由一个根结点及两棵不相交的分别称作这个根的左子树和右子树的二叉树组成

二叉树排序的基本原理:

先构建一颗空树,使用第一个元素作为根节点,
如果之后的元素比第一个小,则放到左子树,否则放到右子树,之后按中序遍历。
时间复杂度:nlog2(n)
空间复杂度:中序遍历时,需要构建栈,为logn.
二叉搜索树的性质:
(1)每个结点都有一个作为搜索依据的关键码(key)也就是数据域,所有节点的关键码互不一样。
(2)左子树(如果存在)上的所有结点的关键码都小于根结点的关键码。
(3)右子树(如果存在)上的所有结点的关键码都大于根结点的关键码。
(4)左右子树也是二叉搜索树

思路

二叉树:如图。
在这里插入图片描述
某个节点最多有两个子节点的树。常用于排序。效率较高。
节点中的值:键。key。
兄弟节点:拥有同一个父节点的节点。
根节点:没有父节点
外部节点:叶子节点,没有子节点。
内部节点:中间节点。有子节点。
高:节点都有深度,最大的节点深度即为这棵树的高。
排序二叉树:节点左孩子的值小于它,右孩子的值大于它。显然,左子树的节点值都比当前节点小,右子树的逗比当前节点大。

代码演示

package com.myjava.binarySortTree;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 
 * @author Xiao Er:
 * 
 * @version 创建时间:2019年4月2日 下午8:59:04
 * 
 * 类说明 :二叉树排序 思想:首先准备一个空二叉树,将需要排序的数组的第一个数放到根节点上,
 *然后将第二个数与根节点上的数进行比较,如果比根节点上的数小,则放到左子树的根节点上, 如果比根节点上的数大则放到有子树上。
  依次执行将所有数组中的数放入到二叉数中,然后进行中序遍历
 * 
 */
public class Node {

	public Node leftNode; // 左节点
	public Node rightNode;// 右节点
	public Object value;// 值

	// 插入数据的方法
	public void add(Object v) {
		if (this.value == null) {
			this.value = v;

			// 如果当前值有值则进行判断
		} else {
			// 如果比当前值小,则放到右子树
			if ((Integer) v - (Integer) value <= 0) {
				if (leftNode == null)
					leftNode = new Node();
				leftNode.add(v);
			} else {
				// 如果比当前值大则放到左子树
				if (rightNode == null)
					rightNode = new Node();
				rightNode.add(v);
			}
		}
	}
	// 进行中序遍历
	public List<Object> values() {
		List<Object> list = new ArrayList<Object>();
		// 左节点遍历
		if (leftNode != null) {
			list.addAll(leftNode.values());
		}
		// 当前节点
		list.add(value);

		// 右节点遍历
		if (rightNode != null) {
			list.addAll(rightNode.values());
		}
		return list;
	}
	public static void main(String[] args) {
		int[] arr = { 12, 23, 534, 65, 86, 7, 4 };
		Node node = new Node();
		for (int val : arr) {
			node.add(val);
		}
		System.out.println("排序前:"+Arrays.toString(arr));
		System.out.println("排序后:"+node.values());

	}
}

IT资讯:鲲鹏击水,浩荡乾坤——中国接入国际互联网25周年
IT精选文章:https://blog.csdn.net/Mirror_w/article/details/89190381
最火的编程语言:https://blog.csdn.net/Mirror_w/article/details/89281041
最牛的编程语言:https://blog.csdn.net/Mirror_w/article/details/89348834

猜你喜欢

转载自blog.csdn.net/Mirror_w/article/details/89421078