今天我们要介绍的是一种特殊的二叉树——二叉搜索树,同时我们也会讲到一种排序算法——二叉树排序算法。这两者之间有什么联系呢,我们一起来看一下吧。

开始之前呢,我们先来介绍一下如何创建一颗二叉搜索树。

假设我们有这样一些数据:[9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]

我们就用这些数据来创建二叉排序树。

首先,我们将第一个数据9作为二叉排序树的根节点,

然后我们拿到第二个数据5,现在我们要进行判断,如果59小,那么就将5插入到节点9的左子树;如果59大的话,就把5插入到9的右子树。经过判断,我们将5插入到9的右左子树,因为9的左节点为空,所以我们直接将5作为9的左节点。

接下来判断第三个数据2,我们同样先将29进行判断,将2插入到9的左子树,但是9的左节点不为空,所以我们再将29的左节点5进行判断。25小,并且5的左节点为空,所以将2作为5的左节点。

以此类推,我们就可以画出一颗二叉搜索树,感兴趣的同学不妨亲自画一下。

那二叉树排序有是怎么回事呢?

我们回过头来看我们刚刚创建好的二叉树,前面我们已经介绍过了二叉树的前序、中序、后序遍历。我们不妨来尝试一下二叉搜索树的三序遍历。

如果对二叉树进行三序遍历的话,你就会发现,二叉搜索的中序遍历结果恰好就是从小到大排列的。

那我们就明白了,创建二叉搜索树并进行中序遍历就可以实现排序。

接下来照例我们用代码实现二叉搜索树和二叉树排序:

#-*- coding: utf-8 -*-

class BinaryTree:
def __init__(self, data):
self.left = None
self.right = None
if type(data) == list:
self.data = data[0]
for d in data[1:]:
self.insert(d)
else:
self.data = data def insert(self, data):
bt = self
while True:
if data <= bt.data:
if bt.left == None:
bt.left = BinaryTree(data)
break
else:
bt = bt.left
else:
if bt.right == None:
bt.right = BinaryTree(data)
break
else:
bt = bt.right def mid_order(self):
result = []
stack = []
node = self
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
result.append(node.data)
node = node.right
return result

上面呢,我们定义了一个二叉树类,并实现了节点的插入和中序遍历方法。在它的构造方法中,如果输入的参数是一个列表,那么我们就根据列表创建二叉搜索树,如果是一个值那么就之创建一个根节点。

下面我们就来创建一下二叉搜索树:

data = [9,5,2,1,4,2,1,41,22,11,35,24,11,10,4,23,9,45,2,35,12,35,16,27,56,31,73]

bt = BinaryTree(data)
mid = bt.mid_order()
print(mid)

执行一下,输出的结果是这样的

[1, 1, 2, 2, 2, 4, 4, 5, 9, 9, 10, 11, 11, 12, 16, 22, 23, 24, 27, 31, 35, 35, 35, 41, 45, 56, 73]

你学会了吗?

数据结构-二叉搜索树和二叉树排序算法(python实现)的更多相关文章

  1. 数据结构☞二叉搜索树BST

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...

  2. 数据结构-二叉搜索树(BST binary search tree)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来 ...

  3. 数据结构-二叉搜索树的js实现

    一.树的相关概念 1.基本概念 子树 一个子树由一个节点和它的后代构成. 节点的度 节点所拥有的子树的个数. 树的度 树中各节点度的最大值 节点的深度 节点的深度等于祖先节点的数量 树的高度 树的高度 ...

  4. 数据结构---二叉搜索树BST实现

    1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...

  5. Java数据结构——二叉搜索树

    定义二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若 ...

  6. 基本数据结构 —— 二叉搜索树(C++实现)

    目录 什么是二叉搜索树 二叉搜索树如何储存数值 二叉搜索树的操作 插入一个数值 查询是否包含某个数值 删除某个数值 测试代码 参考资料 什么是二叉搜索树 二叉搜索树(英语:Binary Search ...

  7. 九度OJ 1009:二叉搜索树 (二叉树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6321 解决:2767 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需 ...

  8. 数据结构 - 二叉搜索树封装 C++

    二叉搜索树封装代码 #pragma once #include <iostream> using namespace std; template<class T>class T ...

  9. 数据结构——二叉搜索树(Binary Search Tree)

    二叉树(Binary Tree)的基础下 每个父节点下 左节点小,右节点大. 节点的插入: 若root==NULL则root=newnode 否则不断与节点值比较,较小则向左比较,较大则向右比较. 完 ...

随机推荐

  1. 算法详解之最近公共祖先(LCA)

    若图片出锅请转至here 概念 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节 ...

  2. python 基础学习笔记(3)--列表与元组

    **本次笔记主要内容为 列表,元组主要的功能和特性** **1.列表**: 学习过c语言的同学应该知道,c语言有数组这一功能,就是将数据类型相同的元素放在一起.由于python的变量没有数据类型,也就 ...

  3. 抽丝剥茧分析asyncio事件调度的核心原理

    先来看一下一个简单的例子 例1: async def foo(): print('enter foo ...') await bar() print('exit foo ...') async def ...

  4. mongo创建集合

    查询 db.getCollection('tbTrade').find({strDealSN:'P2P0_153596710bb00010011ba47b342'}); 更新(第一个{}为条件) db ...

  5. 堡垒机-jumpserver

    目录 官方网站 Jumpserver 软件包环境要求: 环境 手动本地jumpserver-服务端搭建 初始化一些系统环境设置: 安装相关软件 安装 组件 自建服务器极速安装步骤 0. 防火墙.Sel ...

  6. 自定义new和delete

    #include "stdafx.h" #include <stdlib.h> #include <malloc.h> #include <iostr ...

  7. 洛谷P1140 相似基因

    题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...

  8. 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符

    while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...

  9. docker实战(二)之redis的使用

    docker中安装redis的步骤比较简单,Linux系统版本centos7.4 1.官方仓库https://hub.docker.com/r/library/redis/tags/中查看redis的 ...

  10. 《VR入门系列教程》之12---转换矩阵

    转换矩阵     模型网格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动一下模型位置都要依次改变每个网格的顶点坐标,这将一件非常头疼的事,要是遇上需要显示动画效果那就更糟了.为了解决这个问 ...