树和二叉树简介

 一、树

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,一经查实,立即删除!

相关文章

【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;直接给了两个源文…

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

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

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;而不是单纯…

设置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尽最大努力使…

在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幻灯…

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…

U Sparkle 开发者计划招募中!

向我们投稿吧 在此之前&#xff0c;我们有收到过几篇民间高手的投稿&#xff0c;如&#xff1a; USequencer 初识&#xff08;作者&#xff1a;焱燚(七火)&#xff09; Unity游戏界面解决方案: PSD For UGUI&#xff08;作者&#xff1a;张俊钦&#xff09; UGUI 降低填充率技巧…

如何添加引文标_如何在Google文档中查找和添加引文

如何添加引文标When writing papers, you need to generate a detailed and accurate list of all the sources you’ve cited in your paper. With Google Docs, you can easily find and then add citations to all of your research papers. 撰写论文时&#xff0c;您需要生…

Linux Centos下SQL Server 2017安装和配置

Linux Centos下SQL Server 2017安装和配置 原文:Linux Centos下SQL Server 2017安装和配置我们知道在Linux下安装服务有很多方式&#xff0c;最为简单的也就是yum安装&#xff0c;但是很多服务通过yum是无法安装的&#xff0c;如果想使用yum安装&#xff0c;需要指定yum安装仓库…

如何在Linux上使用端口敲门(以及为什么不应该这样做)

Photographee.eu/ShutterstockPhotographee.eu/ShutterstockPort knocking is a way to secure a server by closing firewall ports—even those you know will be used. Those ports are opened on demand if—and only if—the connection request provides the secret knoc…

小到年货大到产业,刘村长的扶贫模式有点厉害!

河北省阜平县平石头村的村民&#xff0c;今年春节再也不用头疼买什么年货&#xff0c;去哪买年货的问题了&#xff0c;因为他们的“村长”刘强东&#xff0c;给每户人家都送来了年货大礼包&#xff01;大礼包里不仅有牛奶、果汁、毛衣、长裤、波司登羽绒服、枕头、毛巾、炊大皇…

克隆ubuntu硬盘_使用Ubuntu Live CD克隆硬盘

克隆ubuntu硬盘Whether you’re setting up multiple computers or doing a full backup, cloning hard drives is a common maintenance task. Don’t bother burning a new boot CD or paying for new software – you can do it easily with your Ubuntu Live CD. 无论是设置…