树、堆、集合

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、集合

并查集

性能提升
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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