树和二叉树简介

 一、树

1、什么是树?

树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树;
树(tree)是包含n(n>0)个结点的有穷集,其中:
(1)每个元素称为结点(node);
(2)有一个特定的结点被称为根结点或树根(root)。
(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。
2、相关术语
  • 节点的度:一个节点含有的子树的个数称为该节点的度;
  • 叶节点或终端节点:度为0的节点称为叶节点;
  • 非终端节点或分支节点:度不为0的节点;
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 树的度:一棵树中,最大的节点的度称为树的度;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度或深度:树中节点的最大层次;
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;

二、二叉树

1、什么是二叉树?

二叉树,就是度不差过2的树(节点最多有两个叉)

三、两种特殊的二叉树

1、满二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。

2、完全二叉树

叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树

满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树

三、二叉树的存储方式

1、链式存储方式

a、二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。

b、节点定义

class BiTreeNode:def __init__(self,data):  #data就是传进去的节点的值self.data = dataself.lchild = Noneself.rchild = None

 

c、二叉树的遍历:

I 、先(前)序遍历:访问根结点的操作发生在遍历其左右子树之前

具体操作:若二叉树非空,则依次执行如下操作:
  • ⑴ 访问根结点;
  • ⑵ 遍历左子树;
  • ⑶ 遍历右子树。

II、中序遍历:访问根结点的操作发生在遍历其左右子树之中(间)。

具体操作: 若二叉树非空,则依次执行如下操作:
  • ⑴遍历左子树;
  • ⑵访问根结点;
  • ⑶遍历右子树。

III、后序遍历:访问根结点的操作发生在遍历其左右子树之后。

若二叉树非空,则依次执行如下操作:
  • ⑴遍历左子树;
  • ⑵遍历右子树;
  • ⑶访问根结点。

IV、层次遍历

用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。

二叉树的遍历代码如下

from collections import deque   #双向队列
from queue import Queue    #单向队列# import queue
# q = queue.Queue()
# q.put('ggg')
# q.get()
class BiTreeNode:def __init__(self,data):self.data = dataself.lchild = Noneself.rchild = None@classmethoddef pre_order(self,root):'''前序遍历(根左右)'''if root: #如果有根节点print(root.data,end='')self.pre_order(root.lchild)self.pre_order(root.rchild)@classmethoddef in_order(self,root):'''中序遍历(左根右)'''if root:self.in_order(root.lchild)print(root.data,end='')self.in_order(root.rchild)@classmethoddef out_order(self, root):'''后序遍历(左右根)'''if root:self.out_order(root.lchild)self.out_order(root.rchild)print(root.data, end='')@classmethoddef level_order(self,root):'''层次遍历(第一层,第二层,第三层...借助队列来实现)'''queue = deque()queue.append(root)while len(queue) > 0:node = queue.popleft()print(node.data,end='')if node.lchild:queue.append(node.lchild)if node.rchild:queue.append(node.rchild)#创建二叉树
a = BiTreeNode("A")
b = BiTreeNode("B")
c = BiTreeNode("C")
d = BiTreeNode("D")
e = BiTreeNode("E")
f = BiTreeNode("F")
g = BiTreeNode("G")
e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f
root = e#查看前序遍历的结果
BiTreeNode.pre_order(root)   #EACBDGF
print('')
BiTreeNode.in_order(root)    #ABCDEGF
print('')
BiTreeNode.out_order(root)  #BDCAFGE
print('')
BiTreeNode.level_order(root)  #EAGCFBD

 

2、顺序存储方式

如上图二叉树标出了元素所对应的索引,那么可以有一下结论

1、父节点和左孩子节点的编号下标有什么关系?

如果已知父亲节点为i,那么他的左孩子节点为2i+1

2、父节点和右孩子节点的编号下标有什么关系?

3、反过来知道孩子找父亲

(n-1)/2=i  # 左孩子求父节点
(n-2)/2=i  # 右孩子求父节点

 四、二叉搜索树

1、定义

二叉搜索树是一棵二叉树且满足性质:设X是二叉树的一个节点。如果Y是X左子树的一个节点,那么Y.key <=X.key;

如果Y是X右子树的一个节点,那么Y.key>= X.key  (X.key代表X节点对应的值)

通俗的说也就是 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。

2、原理

二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)).

3、二叉搜索树的创建

可参考链接:https://visualgo.net/en/bst

4、二叉搜索树的遍历

5、二叉搜索树的查询、插入、删除

插入:

删除

比如要删除65

比如要删除66

代码实现:

 待续....

6、二叉搜索树存在的问题

存在的问题:当插入的是有序的时候,假如插入的数据特别多,找是能找到,但是是很花费时间的。

可以有以下解决办法:

  1、随机化的二叉搜索树(打乱顺序插入)

   2、AVL树

查找方法有:二分查找、二叉搜索树、哈希查找、顺序查找、斐波那契查找

五、AVL树-----扩展(了解)

1、AVL树:AVL树是一棵自平衡的二叉搜索树

2、AVL树具有以下性质:  

  • 根的左右子树的高度只差的绝对值不能超过1
  • 根的左右子树都是平衡二叉树

3、AVL的实现方式:旋转

 

六、B树

1、B树:B树是一棵自平衡的多路搜索树。常用于数据库的索引

 

七、其他

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对eventloop的研究

javasctipt是一门单线程的非阻塞的脚本语言&#xff0c;单线程意味着&#xff0c;JavaScript 单线程意味着&#xff0c;javascript代码在执行的任何时候&#xff0c;都只有一个主线程来处理所有的任务。 JavaScript的事件分两种&#xff0c;宏任务(macro-task)和微任务(micro-t…

【SSH高速进阶】——struts2简单的实例

近期刚刚入门struts2。这里做一个简单的struts2实例来跟大家一起学习一下。 本例实现最简单的登陆&#xff0c;仅包括两个页面&#xff1a;login.jsp 用来输入username与password&#xff1b;success.jsp 为登陆成功页面。error.jsp为登陆失败页面。 1、新建web项目“struts2”…

《智能家居》培训第六天------2019-01-10

目录&#xff1a; 一&#xff09;摄像头 二&#xff09;照明 三&#xff09;所想 四&#xff09;总结 一&#xff09;摄像头 摄像头这块学了跟没学一样我觉得&#xff0c;摄像头给的api&#xff0c;yuyv转rgb24也是给的api&#xff0c;总而言之就是&#xff0c;直接给了两个源文…

在Linux上按大小列出文件和目录

This page will show us how to create a list of files and folders ordered by size using standard Linux commands. 该页面将向我们展示如何使用标准Linux命令创建按大小排序的文件和文件夹列表。 命令 (Command) To get a list with the size of each item in a folder, y…

记一次kafka数据丢失问题的排查

2019独角兽企业重金招聘Python工程师标准>>> 数据丢失为大事&#xff0c;针对数据丢失的问题我们排查结果如下。 第一&#xff1a;是否存在数据丢失的问题&#xff1f; 存在&#xff0c;且已重现。 第二&#xff1a;是在什么地方丢失的数据&#xff0c;是否是YDB…

Maximum upload size exceede上传文件大小超出解决

在这里记录三种方法, 努力提高自己的姿势水平 application.yml配置spring:servlet:multipart:enabled: truemax-file-size: 10MB #单个文件最大大小max-request-size: 1024MB #上传数据总大小 application.properties配置spring.servlet.multipart.max-file-size10Mb #单个文件…

ipad iphone开发_如何在iPhone或iPad上更改应用程序的语言

ipad iphone开发BigTunaOnline/Shutterstock.comBigTunaOnline / Shutterstock.comApple’s iOS 13 makes the iPhone and iPad multilingual. Now, you can change the language of an individual app without changing your primary system language. Each app can have its …

Docker最全教程——从理论到实战(七)

Docker最全教程——从理论到实战&#xff08;七&#xff09; 原文:Docker最全教程——从理论到实战&#xff08;七&#xff09;在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯…

Bash Cookbook 学习笔记 【中级】

Read Me 本文是以英文版<bash cookbook> 为基础整理的笔记&#xff0c;力求脱水2018.01.21 更新完【中级】。内容包括工具、函数、中断及时间处理等进阶主题。本系列其他两篇&#xff0c;与之互为参考 【基础】内容涵盖bash语法等知识点。传送门【高级】内容涉及脚本安全…

设置Windows 10时如何创建本地帐户

Windows 10 tries its hardest to make you use a Microsoft account. The option was already hidden, but now it’s not even offered on Windows 10 Home while you’re connected to the internet. Here’s how to create a local account anyway. Windows 10尽最大努力使…

HSQL

Hive的数据存储  1、Hive中所有的数据都存储在 HDFS 中&#xff0c;没有专门的数据存储格式&#xff08;可支持Text&#xff0c;SequenceFile&#xff0c;ParquetFile&#xff0c;RCFILE等&#xff09;  2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符&…

在PowerPoint 2010中将鼠标用作激光笔

Have you ever wished you had a laser pointer to focus attention on a key point in a PowerPoint slideshow? Today, we’ll take a look at how can use use your mouse as a laser pointer in PowerPoint 2010. 您是否曾经希望激光指示器能将注意力集中在PowerPoint幻灯…

Java 8 并发: 原子变量和 ConcurrentMap

原文地址: Java 8 Concurrency Tutorial: Atomic Variables and ConcurrentMap AtomicInteger java.concurrent.atomic 包下有很多原子操作的类。 在有些情况下&#xff0c;原子操作可以在不使用 synchronized 关键字和锁的情况下解决多线程安全问题。 在内部&#xff0c;原子类…

this表示当前对象简单实例

直接上代码 class Message { private Channel channel ; // 保存消息发送通道 private String title ; // 消息标题 private String content ; // 消息内容 // 4、调用此构造实例化&#xff0c;此时的channel 主类ch public Message(Channel channel,String title,String cont…

twitter推文不收录_如何使用Twitter书签保存推文供以后使用

twitter推文不收录Khamosh PathakKhamosh PathakTwitter has a new Bookmarks feature that lets you privately save tweets for later. If you’ve been using the Like feature as a workaround for saving tweets, here’s why you should start bookmarking. Twitter具有一…

if的作用域问题 *输出1~6的随机数*

1 //测试if语句2 public class TestIf {3 public static void main(String[] args){4 double d Math.random();//0~1之间的小数5 int e (int)(d*5); //[0,4]6 //int f 1(int)(d*6); //[1,6] 掷色子7 System.out.println(e);8 …

为您的Blogger博客设计一个美丽的新主题

Would you like to give your Blogger blog a fresh coat of paint with a new theme? Here’s how you can use the new Template Designer to make your Blogger site stand out from the crowd and look great. 您想给Blogger博客一个新的主题吗&#xff1f; 您可以通过以…

Lab 6-4

In this lab, we’ll analyze the malware found in the file Lab06-04.exe. Questions and Short Answers What is the difference between the calls made from the main method in Labs 6-3 and 6-4? A: The function at 0x401000 is the check Internet connection method…

步入三十岁前的总结:看似经历很多得到很多,但,实际却一无所得

本文算是一篇审视自己的文章吧&#xff0c;感觉跟我类似经历的人应该很多&#xff0c;认同感应该也大一些。我是12年网络专业很普通的一所大专院校毕业&#xff0c;到现在为止工作已经超过五年。这五年里&#xff0c;做过运维工程师&#xff0c;也在小车床工作间里做了一下技工…

vue---day03

1. Vue的生命周期 - 创建和销毁的时候可以做一些我们自己的事情 - beforeCreated - created - beforeMount - mounted - beforeUpdate - updated - activated - deactivated - beforeDestroy - destroyed 1.1 知识点回顾 1.1.1 be…