树和二叉树

什么是树?

树状图是一种数据结构,它是由(n>=1)个有限节点组成一个具有
层次关系的集合,把它叫做"树"把它们叫做“树”是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的它具有这些特点;
每个节点都有零个或多个子节点;没有父节点的称为根节点;除了根节点外,每个子节点可以分为多个不相交的子树;


图片.png

树是包含n(n>0)个节点的有穷集,其中;

  • 每个元素称为节点
  • 有一个特定的结点被称为根或者树根
  • 除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree).
相关术语
  • 节点的度:一个节点含有子数,子树的个数称为该节点的度;
  • 叶节点或者终端节点:度为0的节点称为叶节点;
  • 非终端节点或分支节点:度不为0的节点;
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;
  • 树的度:一棵树中,最大的节点的度称为树的度;
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度或深度:树中节点的最大层次;
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;
  • 节点的祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;

二叉树

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


图片.png

三.两种特殊的二叉树

1.满二叉树
一个二叉树,如果每一个层的节点数都到达最大值,则这个二叉树就
是满二叉树.
2.完全二叉树
叶节点只能出现在最下层,并且最下面一层的节点都集中在该层最左边的
若干位置的二叉树


图片.png

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

三.二叉树的存储方式

1链式存储方式

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

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 = 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顺序存储方式
图片.png

1.父节点和左孩子节点编号下标有什么关系?
如果已知父亲节点为i,那么他的左孩子节点为2i+1


图片.png

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


图片.png

3,,反过来知道孩子找父亲
(n-1)/2=i
(n-2)  /2=i

四.二叉搜索树

1.定义

二叉搜索树是一颗二叉树切满足性质:设x是二叉树的一个节点.如果y是x左子树的一个节点,那么y.key<=x.key,如果y是x右子树的一个节点,那么y.key>=X.ky(x.ky代表x节点对应的值)
通俗的说也就是 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。


图片.png
2,原理

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

3.二叉搜索书的创建

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

4.二叉搜索树的遍历
5.二叉搜索树的查询,插入,删除

插入:

图片.png

删除
图片.png

比如删除65
图片.png

比如要删除66
![图片.png](https://upload-images.jianshu.io/upload_images/8562039-85d579132e44f9b9.png?imageMogr2/auto-orient
/strip%7CimageView2/2/w/1240)

二叉搜索树存在问题

存在的问题:当插入的是有序的时候,假如插入的数据特别多,找是能找到的,但是很浪费时间
可以有一下解决方法:

  • 随机化的二叉树搜索树(打乱顺序插入)
  • AVL树
    查找方法:二分查找,二叉搜素树,哈西查找,顺序查找,斐波那契查找

五.avc树----扩展(了解)

1.AVL树:AVL树是一颗平衡的二叉搜索树
2.AVL树具有一下性质:

  • 根的左右子树的高度只差的绝对值不能超过1
  • 根的左右子树都是平衡的二叉树
    3.AVL的实现方式:旋转


    图片.png

六.b树

1.b树:b树是一颗自平衡的多路搜索树,常用于数据库的索引


图片.png

七,其他

图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容