树、堆、集合

A、树

事物之间的层次关系,例如文件管理,家谱,图书信息等

二叉树(binary tree)

二叉树的遍历

# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Queue(object):  # 队列结构

    def __init__(self):  # 使用list模拟队列
        self.items = []

    def isEmpty(self):
        return len(self.items) == 0

    def Enqueue(self, item):  # 入队
        self.items.append(item)

    def Dequeue(self):  # 出队
        return self.items.pop(0)

    def Getlength(self):  # 获取队列长度
        return len(self.items)

    def printQue(self):
        for item in self.items:
            print(item)



class stack(object):  # 堆栈,后进先出
    def __init__(self):
        self.items=[]

    def isEmpty(self):
        return len(self.items)==0

    def push(self,item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        if not self.isEmpty():
            return self.items[-1]

    def size(self):
        return len(self.items)

# 二叉树的遍历,先序、中序、后序、层次

def printTree(head):  # 先序遍历,递归算法
    if head:
        print(head.val)  # 头节点
        printTree(head.left)  # 遍历左子树
        printTree(head.right)  # 遍历右子树


def printNode(head):  # 层序遍历,加入队列
    if not head:
        return False
    q = Queue()
    q.Enqueue(head)
    while (q.isEmpty() == False):
        t=q.Dequeue()
        print(t.val)
        if t.left:
            q.Enqueue(t.left)
        if t.right:
            q.Enqueue(t.right)

def printStack(head): #采用非递归遍历,二叉树(采用堆栈,中序为例)
    p=head
    s=stack()
    while(s.isEmpty()==False or p):
        while(p): #压入左子树
            s.push(p)
            p=p.left
        if (s.isEmpty()==False):
            t=s.pop()
            print(t.val)
            p=t.right

def getDepth(head):
    if not head:
        return 0
    maxleft, maxright = 1, 1
    maxleft += getDepth(head.left)  # 遍历左子树
    maxright += getDepth(head.right)  # 遍历右子树
    return max(maxleft, maxright)

root = TreeNode(1)
root.left = TreeNode(1)
root.right = TreeNode(2)
root.left.left = TreeNode(3)
printStack(root)

二叉搜索树

搜索树的特征:

二叉搜索数的特征

Find 函数(与树的高度与结构有关)

def find(x,head): #查找效率取决于树高 尾递归方式
   if not head:
       return False
   if x>head.val:
       return find(x,head.right)
   elif x<head.val:
       return find(x,head.left)
   else:
       return head

def Find(x,head): #非递归方式,查找效率取决于树高
   while(head):
       if x>head.val:
           head=head.right
       elif x<head.val:
           head=head.left
       else:
           return head

def Findmin(head): #最小值的查找
   if not head:
       return False
   while(head.left):
       head=head.left
   return head


def Findmax(head): 最大值的查找
   if not head:
       return False
   while(head.right):
       head=head.right
   return head

def insert(item,head): #插入
   if not head:
       head=TreeNode(item)
   elif item<head.val:
       head.left=insert(item,head.left)
   elif item>head.val:
       head.right=insert(item,head.right)
   return head

def delete(item,head): #删除
   if not head:
       print('ERROR')
   elif item>head.val:
       head.right=delete(item,head.right)
   elif item<head.val:
       head.left=delete(item.head.left)
   else:
       if head.left and head.right:
           temp=Findmin(head.right)
           head.val=temp.val
           head.riht=delete(head.val,head.right)
       elif head.left==None:
           head=head.right
       elif head.right==None:
           head=head.left
   return head

视频详解

平衡二叉树

不同搜索树的结构,影响其平均查找长度ASL,衡量查找效率,高度为logN;

平衡二叉树

平衡二叉树的调整:

右单旋
image.png
image.png

应用Sample

多项式的运算

B、堆

优先队列,按照元素的优先权而非元素的进入队列的先后顺序;
完全二叉树进行存储,且根节点为以它为跟的子树的最小或最大值

Huffman Tree

Huffman Tree 的构造,每次将权值最小的两颗二叉树进行合并,

C、集合

并查集

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

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,221评论 0 25
  • 一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要使用到,那...
    24K男阅读 6,751评论 5 14
  • 因为之前就复习完数据结构了,所以为了保持记忆,整理了一份复习纲要,复习的时候可以看着纲要想具体内容。 树 树的基本...
    牛富贵儿阅读 6,877评论 3 10
  • 判定树 每个结点需要查找的次数刚好为该结点所在的层数,查找成功时查找次数不会超过判定树的深度,n个结点的判定树的深...
    sunxiaohang阅读 1,493评论 0 3
  • 近几年来,我国建筑工程高度不断上升,地下室、地下停车场、购物、娱乐场所等的建设不断完善,使基坑开挖、边坡维护以及建...
    工程宝阅读 1,433评论 1 1