树和二叉树的基本概念(二级)

我们来看数据结构的另外一块内容,树和二叉树,

这是我们数据结构的一个重点,尤其是二叉树来说,树是一个重点,我们主要是研究二叉树,

先看一下树的基本概念,然后我们再看一下二叉树的基本知识,这两部分讲完之后呢,就来将二叉树的实现,

主要是来讲二叉树的遍历,有先序,中序,后序遍历,我们这个遍历不仅要给出一个二叉树,写出你的遍历结果

把各个节点写出来,还要通过代码把它实现,在这里面我们是大量的使用了递归的,包括在我们后续的图里面,

甚至查找排序里面,递归是得到大量的使用的,我们先看树的基本概念


什么叫树?

生活中的树是什么,是族谱,上下级关系,倒挂着数,然后是一对多的关系,一个公司的组织架构,包括一个盘的目录结构,

这都是树状结构,我们要是把他化成逻辑结构呢,这么来画就可以了,他表示的是一种上下级的关系,这个都带箭头的,

这个大家明确一下,树是tree,树最少有几个节点,树最少0个节点,0个节点就是一个空树,一个节点只有一个根,

A上面什么也没有,一个节点也没有,这也是一种树,n大于等于0,或者是一颗空树,n等于0,不包括任何节点,或者是一个非空树,

但是至少有一个节点,既是最上层的也是最底层的,或者是分成很多层次的,这样一种一对多的关系


什么叫做节点的度和树的度?

度用英文单词表示就是Degree,通俗的来说,节点的度就是这个节点往下分了几个叉,他又几个子树,比如说,A的度是几,

是3,为什么是3,因为有3个子树,或者说有3个叉,然后这个K的度是几,是0,H是1,这里面有没有度为2的节点,B和E,这是节点

的度,整个树的度是多少,就是最大节点的那个度呗,这个度有0的,有1的,有2,也有3的,节点的最大节点是3,树的度就是

最大节点的最大值,这没有任何难度吧,如果一个度它的节点是0,那说明什么,K,L,M,I,J这些节点度是0,说明他们

是生活在最底层的,如果对应我们的一个文件目录的话,表明它是一个文件,它不是个文件夹,我们取个名字叫叶子节点

度为0的节点我们称之为叶子节点,或者叫终端节点,度不是0的呢,就叫非终端节点,比如看这个图里面,我们用两种颜色

标记了,哪两种颜色,绿色的叫终端节点,也是叶子节点,然后蓝色的,非终端节点,还有一个特别的标记了一下,这个叫根节点

非终端节点,除了根以外的分支节点,称之为内部节点,根不算内部的,根算外部的,除了根之外的终端节点,我们可以起个名字

叫内部节点,根据这个图我们就把这个概念理解了.
节点的层次和树的深度?

节点是第几层,根有第几层,整个树有几层,总共有4层,根算第一层,这个要明确一下,我们要建立我们共同语言才可以,

他的孩子就是第二层,孩子的孩子就是第三层,再往下就是第四层,E他的层次是3,C是2,根永远是1,叶子的层次会是几,

叶子的层次就不确定,这几个叶子是4,这两个叶子就是3,那不确定,

树的深度是什么,就是树一共有多少层呗,一共有几层啊,或者树的最大层次数,称为树的深度,或者叫高度,在往下看,



父亲,儿子,兄弟?

什么叫父亲儿子兄弟,A和B相比,A和B是什么关系,A是父亲,B是儿子,B有没有兄弟,有,C和D,请问E有没有兄弟,有谁啊,

有F,这G,H算是他的兄弟吗,不是亲兄弟,是不是堂兄弟,我们这个父亲,儿子是指亲儿子的,兄弟也是指亲兄的,

父子关系,兄弟关系


祖先,子孙,堂兄弟?

比如我要问,对于这个E来说,他的祖先是谁,那对于K来说祖先是谁,是A,B叫他的祖先吗,不是这么来说的,最终我们建立

这种关系,K的祖先是谁,EBA,往上的都是他的祖先,不是光最顶级的那个,什么叫祖先,以K为例,往上到第三层,

到第二层,顺着这条线往上走,都是他的祖先,什么叫子孙呢,比如B,B的子孙有谁,EF是他的儿子,KL都是他的子孙,

这里面有一个节点叫A,高高在上,下面所有的这些都是他的子孙,什么叫堂兄弟,E他的堂兄弟有谁,有GHIJ,这些都相当于

他的堂兄弟,F相当于是他的亲兄弟,K的堂兄弟是M,这个关系就远一点了,K的父亲和F的父亲也不是亲兄弟,

E的父亲和H的父亲这是亲兄弟了,层次越多这个关系就会稀疏一些,堂兄弟只要是在一个层次的,我们认为都是堂兄弟,

建立这种关系,建立这种概念,再往下


什么叫有序数? M叉树? 森林?

有序数是什么意思啊,你觉得是一棵树还是两颗树,是不是都有B,是不是还有一棵树叫F,有什么区别,顺序是不是变了一下,

是一棵树还是两棵树,如果你说这是两棵树,那就是左右是区分的了,那叫有序数,如果你说这是一棵树,不区分左右,那就是

无序的了,明确一下,如果不考虑子树的顺序,就称为无序树,考虑的话就是有序树,明确一下,如果不做特别的指明,我们讨论

的一般都是有序树,什么叫M叉树,就是最多有几个叉,比如说这个算几叉树,这个算2叉树,B有两个叉,E分两个叉,二叉树,

再找个例子来说,这个是几叉树,这个是3叉树,最多是三个叉,还有吗,这个是几叉树我们就不数了,这个叉就多了去了,

几叉树明确了,什么叫森林,一般森林和树是什么关系,就是一堆树呗,一堆树就是森林,就是这个样子的,但是最少的森林有

几棵树,森林是m和互不相交树的集合,注意啊必须是互不相交的,你看这是一棵树,这是一颗,这是另外一颗,是不是没有关系

没有关系,这是个二叉树,这是个一叉树,这是个三叉树,互不相交的树,m大于等于0,一颗两颗三颗,0颗可以,他这森林就是空的呗

树可以是空的,森林也可以是空的,森林就是m大于等于0颗互不相交树的集合,如果我们对这三颗树再加一个共同的父类,

共同的父节点,他又变成一棵树了,这是一棵树,如果我们把D去掉,D去了,把这个根去了,他又变成一个森林了,这是我们说的树的

一些概念,比较简单,二叉树就会稍微繁琐一下,我们在后续的课程中主要是研究二叉树,你如果不做限制条件的话,

研究任何形式的树不好研究,因为它到底分多少叉呢,这个不确定
二叉树:

什么叫二叉树,简单来说就是分2个叉呗,仔细一看这是不是二叉树,是的,二叉树怎么来定义,可以递归定义的,什么叫二叉树,

严格来说,脑子里面怎么来想的,为什么你说他是个二叉树,我们给出严谨的定义,这是一个根,他又几个子树,;两个子树,

二叉树都是有序的,这么一来你会发现他有一个左子树,还有一个右子树,最多分两个叉,然后对他的左子树来说怎么办,

对于他的左子树来说,我们同样可以,这是一个根,左子树没有,右子树在这儿,最多分两个叉呗,同样递归定义,对于他的右子树来说怎么了

这是一个根,这是一个左子树,这是一个右子树,结束了吧,没有,对于这个节点来说,它是根,他有左子树吗,没有,

他有右子树吗,没有,最多分两个叉,是不是可以一个叉也没有,这就是我们递归的定义,总体上是二叉树,局部也是二叉树,

每一部分都是二叉树,可以是一个空树,我先问大家一下,如果我们有这么一块内容,这是不是一个二叉树,

这两个节点是二叉树,他也是二叉树,最多分两个叉,人家分一个叉,我只有一个根,也可以是一个二叉树,这是不是也是二叉树,

我来个空的,也可以是二叉树,这个概念大家可以搞明白了,每个孩子有左右之分,左子树和右子树,这是我们二叉树的5种基本状态

画横线的表示一个节点也没有,b呢只有根节点,C只有左子树,e只有右子树,这是两颗不同的树,c和e是两颗不同的树

因为他是有序的,d既有左子树又有右子树


什么叫满二叉树?

每一层都是最多的节点,那你想第一层最多是几个节点,第一层是根节点,是不是有一个,第二层两个,第三层4个,下一层8个,

左边是不是满足这个条件,每一层都是满的,满二叉树,高度为k的树最多有几个节点,每层都达到最满的,就是二叉树,



什么叫完全二叉树?

这是一个完全二叉树,什么算是完全的,一共是4层,第一层是满的,第二层也是满的,第三层也是满的,不满的只是最下面一层,

并且他这个不满是怎么个不满呢,从右边开始不满的,如果我要是把11去了,有12,他是不是完全的,不是完全的,他必须有这个

11,有10,有12,中间没有11,那就是不完全的,最下层从最右侧起,去掉若干个叶子节点,得到的是完全二叉树,比如这是一个完全的

从右边开始去,得到的一直是完全二叉树,是不是又变成一颗满二叉树了,满二叉树肯定是完全二叉树,完全二叉树不见得是满的

满的是完全的一种特殊情况吧,这是我们所说的一种概念,概念大家必须要知道的,什么叫满二叉树,什么叫完全二叉树,

这样的一些概念,再往下
二叉树他有一些性质的?

有什么性质呢,总共有6个性质,我们就不一一说明了,比如说你会发现这里是有特点的,比如给大家举个例子,大家仔细的数,

左边这个例子里面,叶子节点有几个,左边的叶子节点,8个,然后度是2的节点,分两个叉的,7个,好像正好差一个,我们数一下

叶子节点有几个,3个,度是2的节点,2个,是不是还差一个,这是不是一个规律,这是一个规律,二叉树里面是有这个性质的,

什么性质,对于任意一个二叉树,其终端节点是n0,度为2的节点是n2,n0=n2+1,他们正好是差一个,你要是去网上查一些复杂的资料

他对这些性质会有数学证明的,说明他是非常严谨的,还有一个每一层最多有多少个节点,第一层有1个,第二层有2个,第三层有4个,

第四层有八个,请问第i层有几个,2的i减1次方,那这个对不对呢,二叉树的i层上最多有2的i减1次个节点,但是有些性质他是这么来写的

有些是把根当做第0层的,这个明确一下,我特别标记了,根是第一层,还有其他的一些性质,这是我们讲的二叉树的6个性质,

大家下去看一下


下面我们来讲一下二叉树的存储结构

同样我们线性表怎么来存的,线性表顺序存储结构,链式存储结构,我们的栈和队列怎么来存的,顺序结构和链式存储结构,到树这一样,

到树这里还是这个样子,因为我们采用数组来存,第二个我们采用链式存储结构来存,实际开发中哪一种用的多,链式存储结构,

为什么顺序存储结构用的不多呢,我们来看一下,如果他是一个完全二叉树的话,每一层都是满的,除了最后一层,这么一来我们可以

这么来存,这么来存就怎么了,我们来标记一下,这是个完全二叉树,我们存了1,2一直存下去,并且你可以发现每一层都没有落下,

存在二叉树里面一个空间一个,空间没有浪费,第二个也不需要存地址,这里面并且还隐藏着父子关系,我就知道4的父亲是谁,

4的父亲是谁,4的儿子是谁,我都可以知道,为什么知道啊,因为它每次必须分两个叉,按照索引来说,随便哪一个索引是6个元素,

你不要看上面的图,值是不是7,7的父亲是3,7除以2,整除的话是3,然后9除以2,4.5取整就是4,4的孩子乘以2,是8,9,他们之间

是有父子关系的,他的索引是从0开始算,从0开始算和从1开始算是有差别的,在二叉树里面,二叉树里面是有这个规律的,

对一颗有n个节点的完全二叉树,进行编号,节点从1开始,如果从1开始,他的双亲是谁,孩子是谁,有没有左孩子



但是顺序存储结构我们用的不多呢?

因为我们处理的树不是完全的,有人说这个我会存,这个不是太简单了吗,这是不是1,3,7,我这里不是存个1,3,7不就行了吗,

你要这么存的话就要对应哪个树,他应该对应这个棵树,是这么来的,我们还得靠性质6,根据索引找到双亲和孩子的,

你要这么来搞按照公式来说,那只能表示这棵树,对于这种二叉树来说,我们用顺序结构来表示,没有节点的话写一个,

这儿还有一个,这儿还有一个,这儿还落着一个,没有值就空着,3写到这,123没有就空着的,7位写到这,有人说我为什么要这么存

这样存就可以找到他的孩子和他的双亲,但是这么做好不好,不好,为什么不好,大量的浪费,为了维持这种父子关系,导致了

空间的浪费,这个大家了解就可以了,那实际开发中用的最多的还是链式存储结构
链式存储结构:

我们在这里给大家画一棵树,顺序表怎么用数组来表示已经说了,但是=这棵树用顺序表来表示不太合理,会导致一些浪费,

既然会导致浪费就使用链表来存储呗,同样,这是有很多的节点来组成,那你想这个节点有几部分组成,画上一个节点,

表明代表这个根节点,最少也应该包括3部分,首先要存放这个数据E,起个名字叫data,他就代表数据,left是左子树,

right右子树,当然这是两个引用,或者叫指针,是不是和我们的链表里面一样的,如果这是一个Node话,他还是指向Node的,

下边该怎么画,E有了,A往这里画,仔细的画画一遍就搞懂了,看样子我们还得多画几个,告诉我该怎么办,这个地址0X2012,

0X5012,这个0X6012,这个0X9999,就像告诉大家这个地址没有规律,0X8888,就是他,告诉我这个地址多少,这个0X1012,

先写数吧,A,这个G,这个C,这个B,这个D,F,都有了,我这里写什么0X2012,这里0X5012,是不是就指向这一块了,

这应该怎么画,这里是空的,没有,我们直接连就可以了,这个位置指向这儿的,C是0X9999,对于叶子节点来说,没有左孩子

也没有右孩子,或者说没有左子树也没有右子树,有时候我发现呢,写这么一个符号^,也就代表null的,

用它来表示就可以了,如果你这颗树不规则的话,我们是不是可以采用这种方式来存储,但是这个存储有一个特点,

有一个什么特点,就像我们的链表一样,它是从上到下指向的,我找到这个E吧,左海子就通过这个地址找到他了,

根据这个地址就可以找到他了,可以往下走,根据父亲找儿子,是没有任何问题的,我想找到D的父亲是谁,我想找到C的父亲

是谁,比如C的父亲是谁,是不是要从头找,就像我们的链表一样,但是链表只能向后找,不能向前找,双向链表是不是可以都找,

这个也差不多,现在是只能从父亲找儿子,只能从祖先找后代,但是我有了一个后代,想知道他的上级,他的父亲是谁,

他的祖先是谁,你知道吗,不知道,如果你想提高效率,就要拿着空间换时间,多分一点空间存储一些有用的数据,

然后呢,我们查找的时候就简单了,怎么来办,这么来办就可以了




二叉链表:

只能找孩子,怎么就成了三叉了,我们特别标记一下,再补一个,就补了一块,补完了一块怎么办,每个节点再增加一个域,

存放他父亲的地址,0X6012,这么一来怎么办,是不是就这样指向了,然后我们再来看,0X2012,这种引用关系就存在了,

0X1012,怎么办,指向根了,他的父亲是null,它是从石头里面出来的,你看增加这空间有什么好处,可以顺藤摸瓜找他的后代

现在我们随便找一个后代,以B为例,可以以此往上找他的各级祖先,从哪先走的,我刚才这儿没有写吗,0X6012,

先找到C,再找到A,再找到E,到顶了到根了,这就是我给大家所讲的关于树和二叉树的一些基本的概念,包括他的一些

基础的知识,二叉树我们还讲了讲他的存储结构,再次说明一下,二叉树是我们研究最多的树,一般是采用链式存储结构的,

这个我们称之为二叉链表,这个怎么是二叉树呢,这不是有三部分吗,三部分有一部分是存数据的,有两部分是分叉的,

这个是三叉链表,三叉链表就是增加了一找父亲的,这样的一个指针,在这个基础上,这个讲完以后,我们就可以来讲二叉树的实现了

我们就要写相关的代码了,来实现二叉树的各种操作了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值