树和堆(Python)

目录

利用字典实现

完全实现

插入删除和查询

前、中、后遍历和层序遍历

测试

自带实现


利用字典实现

import json
from collections import defaultdict

def tree():
    return defaultdict(tree)

完全实现

#二叉树
#二叉查找树:插入、删除、查找
class Node:
    def __init__(self,data):
        self.data = data
        self.lchild = None
        self.rchild = None
    
class BST:
    def __init__(self,datalist):
        if len(datalist)>0:
            self.root = Node(datalist[0])
            for data in datalist[1:]:
                self.insert(data)
        else:
            self.root = None

插入删除和查询

    def search(self,node,parent,data):
        if node==None:
            return False,node,parent
        if node.data == data:
            return True,node,parent
        if node.data<data:
            return self.search(node.rchild,node,data)
        else:
            return self.search(node.lchild,node,data)
            
    def insert(self,data):
        flag,node,parent = self.search(self.root,self.root,data)
        if flag:
            print 'yiyou'
        else:
            new_node = Node(data)
            if data>parent.data:
                parent.rchild = new_node
            else:
                parent.lchild = new_node
    
    def delete(self,data):
        flag,node,parent = self.search(self.root,self.root,data)
        if not flag:
            print 'no one'
        else:
            if node.lchild == None:
                if node == parent.lchild:
                    parent.lchild = node.right
                else:
                    parent.rchild = node.right
            elif node.rchild == None:
                if node == parent.lchild:
                    parent.lchild = node.light
                else:
                    parent.rchild = node.light
            else: #左右子树都不为空
                pre = node.lchild
                if pre.rchild == None:
                    node.data = pre.data
                    node.lchild = pre.lchild
                else:
                    next_node = pre.rchild
                    while not next_node.rchild:
                        pre = next_node
                        next_node = next_node.rchild
                    node.data = next_node.data
                    pre.rchild = next_node.lchild

前、中、后遍历和层序遍历

    def preOrderTraverse(self,node): #前序遍历
        if node:
            print node.data,'  ',
            self.preOrderTraverse(node.lchild)
            self.preOrderTraverse(node.rchild)
            
    def inOrderTraverse(self,node):#中序遍历
        if node:
            self.inOrderTraverse(node.lchild)
            print node.data,'  ',
            self.inOrderTraverse(node.rchild)
    
    def postOrderTraverse(self,node):#后序遍历
        if node:
            self.postOrderTraverse(node.lchild)
            self.postOrderTraverse(node.rchild)
            print node.data,'  ',

    def printFromTopToBottom(self,node):#层序遍历
        if not node:
            print '[]'
            return
        current = [node]
        outlist = []
        while current:
            nextStack = []
            for n in current:
                if n.lchild:
                    nextStack.append(n.lchild)
                if n.rchild:
                    nextStack.append(n.rchild)
                outlist.append(n.data)
            current = nextStack
        print outlist
        return

测试

if __name__=="__main__":
    # 不需要创建节点
    user=tree()
    user['codingpy']['username']='earlgrey'
    user['python']['username']='Guido van Rossum'
    print(json.dumps(user))
    print("*******************************************************")
    a = [49, 38, 65, 97, 60, 76, 13, 27, 5, 1]
    t = BST(a)  # 创建二叉查找树

    # t.width_circle()
    print("\n前序遍历")
    t.preOrderTraverse(t.root)
    print("\n中序遍历")
    t.inOrderTraverse(t.root)

    t.delete(49)
    print("\n后序遍历:")
    t.postOrderTraverse(t.root)
    print("\n层序遍历:")
    t.printFromTopToBottom(t.root)

自带实现

from heapq import *
class Heap_Pri_Queue(object):
    def __init__(self, heap=[]):
        self.heap = heap
        heapify(self.heap)

    def enqueue(self, val):
        heappush(self.heap, val)

    def dequeue(self):
        return heappop(self.heap)

参考:https://github.com/xwj0813/DataStruct/blob/master/%E7%AC%AC5%E5%A4%A9%EF%BC%9A%E4%BA%8C%E5%8F%89%E6%A0%91%EF%BC%8C%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是哈夫曼树的构造代码实现: ```python from heapq import heappush, heappop, heapify class Node: def __init__(self, freq, symbol=None, left=None, right=None): self.freq = freq self.symbol = symbol self.left = left self.right = right def __lt__(self, other): return self.freq < other.freq def build_huffman_tree(freq_dict): heap = [Node(freq, sym) for sym, freq in freq_dict.items()] heapify(heap) while len(heap) > 1: node1 = heappop(heap) node2 = heappop(heap) new_node = Node(node1.freq + node2.freq, left=node1, right=node2) heappush(heap, new_node) return heappop(heap) def traverse_tree(node, prefix="", encoding={}): if node is None: return if node.symbol is not None: encoding[node.symbol] = prefix traverse_tree(node.left, prefix + "0", encoding) traverse_tree(node.right, prefix + "1", encoding) return encoding if __name__ == "__main__": freq_dict = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45} huffman_tree = build_huffman_tree(freq_dict) encoding = traverse_tree(huffman_tree) print(encoding) ``` 此代码实现了哈夫曼树的构造,使用了优先队列(heapq)和递归遍历树的方法。其中,`build_huffman_tree`函数先将每个字符作为一个节点加入堆中,然后每次取堆中频率最小的两个节点作为左右子节点构造新的节点,直到堆中只有一个节点,即为哈夫曼树的根节点。`traverse_tree`函数用于递归遍历哈夫曼树,并生成每个字符的编码。最后通过调用`traverse_tree`函数生成编码。 ### 回答2: 哈夫曼树是一种用来构造最优前缀编码的方法,可以通过频率统计来确定字符的编码方式,其中出现频率越高的字符编码越短,出现频率越低的字符编码越长。 在Python中,可以使用哈夫曼树的构造算法来实现: 首先,需要对字符的频率进行统计。可以使用字典来记录每个字符的出现次数。 然后,根据字符的频率构造一颗哈夫曼树。哈夫曼树的构建也可以使用堆来实现,将所有的字符频率放入最小堆中。 接着,我们可以通过不断合并堆中最小的两个节点,构建哈夫曼树。每次合并最小的两个节点,生成一个新的父节点,其权值为两个子节点的权值之和。然后将新生成的父节点插入堆中,重复这个过程直到只剩下一个节点为止。 最后,通过遍历哈夫曼树的路径,为每个字符生成其对应的哈夫曼编码。对于每个节点,向左走的路径标记为0,向右走的路径标记为1。通过递归的方式,可以生成每个字符的哈夫曼编码。 通过以上步骤,我们可以得到每个字符的哈夫曼编码,从而实现字符的最优前缀编码。 ### 回答3: 哈夫曼树是一种常用于数据压缩、编码和解码的树形数据结构。以下是用Python实现哈夫曼树的构造过程: 首先,我们需要定义一个节点类来表示哈夫曼树的节点。节点类包含一个频率属性和两个指针分别指向左子树和右子树。 接下来,我们需要统计每个字符在给定文本中出现的频率。可用字典或列表保存字符及其频率。 然后,我们将每个字符创建为一个独立的节点,并按照频率对节点进行排序。 接着,从频率最低的两个节点中选择出来,创建一个新的父节点,并将频率之和赋值给父节点。 将这个父节点插入到节点列表中,并删除原先的两个节点。重复这个过程,直到只剩下一个节点时,即为哈夫曼树的根节点。 最后,可以通过遍历哈夫曼树来获取每个字符的编码。左子树路径上添加0,右子树路径上添加1。 以上就是用Python实现哈夫曼树的构造过程。通过这个算法,我们能够根据字符出现的频率来构建出一个高效的编码方式,从而实现数据的压缩和编码解码的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值