龙空技术网

编程小故事:树与二叉树

Midjourney关键词和绘画 176

前言:

如今你们对“中序遍历二叉排序树所得的序列是什么序列”大体比较重视,兄弟们都想要学习一些“中序遍历二叉排序树所得的序列是什么序列”的相关资讯。那么小编在网上搜集了一些对于“中序遍历二叉排序树所得的序列是什么序列””的相关内容,希望同学们能喜欢,朋友们一起来了解一下吧!

一、树

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 = data       self.lchild = None       self.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 = data       self.lchild = None       self.rchild = None   @classmethod   def pre_order(self,root):       '''前序遍历(根左右)'''       if root: #如果有根节点           print(root.data,end='')           self.pre_order(root.lchild)           self.pre_order(root.rchild)   @classmethod   def in_order(self,root):       '''中序遍历(左根右)'''       if root:           self.in_order(root.lchild)           print(root.data,end='')           self.in_order(root.rchild)   @classmethod   def out_order(self, root):       '''后序遍历(左右根)'''       if root:           self.out_order(root.lchild)           self.out_order(root.rchild)           print(root.data, end='')   @classmethod   def 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 = ae.rchild = ga.rchild = cc.lchild = bc.rchild = dg.rchild = froot = e#查看前序遍历的结果BiTreeNode.pre_order(root)   #EACBDGFprint('')BiTreeNode.in_order(root)    #ABCDEGFprint('')BiTreeNode.out_order(root)  #BDCAFGEprint('')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、二叉搜索树的创建

可参考链接:

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

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

可以有以下解决办法:

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

  2、AVL树

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

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

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

2、AVL树具有以下性质:  

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

3、AVL的实现方式:旋转

七、B树

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

八、其他

最后

刚整理 2020 年全套最新精品技术资料免费发给你! (原价最少8999元,超2000G!)

领取 看看下面!!

1、点赞 + 评论 (勾选 “转发” )

2、关注小编私信。点击头像,关注。并私信回复关键词: 1024

标签: #中序遍历二叉排序树所得的序列是什么序列