Python数据结构与算法分析 第六章 树

用链表实现

class BinaryTree:
    def __init__(self,root):
        self.key=root
        self.left=None
        self.right = None
    def insertleft(self,newnode):
        if self.left is None:
            self.left=BinaryTree(newnode)
        else:
            t=BinaryTree(newnode)
            t.left = self.left
            self.left=t
    def insertright(self,newnode):
        if self.right is None:
            self.right=BinaryTree(newnode)
        else:
            t=BinaryTree(newnode)
            t.right = self.right
            self.right=t
    def getright(self):
        return self.right
    def getleft(self):
        return self.left
    def setval(self, val):
        self.key=val
    def getval(self):
        return self.key

r=BinaryTree('a')
r.insertright('b')
r.insertleft('b')
r.getright().setval('hello')
r.getleft().insertright('d')

完全二叉树列表表示

如果节点的下标为p,那么其左子节点下标为2p, 右子节点为2p+1,其父节点下标为p//2
在这里插入图片描述

表达式解析

前序遍历(preorder) : 先访问根节点,再递 归地前序访问左子树、最后前序访问右子树;
中序遍历(inorder) : 先递归地中序访问左子 树,再访问根节点,最后中序访问右子树;
后序遍历(postorder) : 先递归地后序访问左 & ( 先序 子树,再后序访问右子树,最后访问根节点。
在这里插入图片描述

遍历

class BinaryTree:
    def __init__(self,root):
        self.key=root
        self.left=None
        self.right = None
    def insertleft(self,newnode):
        if self.left is None:
            self.left=BinaryTree(newnode)
        else:
            t=BinaryTree(newnode)
            t.left = self.left
            self.left=t
    def insertright(self,newnode):
        if self.right is None:
            self.right=BinaryTree(newnode)
        else:
            t=BinaryTree(newnode)
            t.right = self.right
            self.right=t
    def getright(self):
        return self.right
    def getleft(self):
        return self.left
    def setval(self, val):
        self.key=val
    def getval(self):
        return self.key
def preorder(tree):
    if tree:
        print(tree.getval())
        preorder(tree.getleft())
        preorder(tree.getright())
def posorder(tree):
    if tree !=None:
        posorder(tree.getleft())
        posorder(tree.getright())
        print(tree.getval())
def inorder(tree):
    if tree !=None:
        inorder(tree.getleft())
        print(tree.getval())
        inorder(tree.getright())
r=BinaryTree('a')
r.insertright('b')
r.insertleft('b')
r.getright().setval('hello')
r.getleft().insertright('d')
preorder(r)
print()
posorder(r)
print()
inorder(r)

def postval(tree):#后续遍历表达式求值
    if tree:
        res1=postval(tree.getleft())
        res2=postval(tree.getright())
        return eval(res1+tree.getval+res2)
def printexp(tree):
    sval=''
    if tree:
        sval='('+printexp(tree.getleft())
        sval=sval+str(tree.getval())
        sval=sval+printexp(tree.getright())+')'
    return sval
postval(r)

优先队列与二叉堆

from pythonds.trees.binheap import BinHeap
bh=BinHeap()
bh.insert(5)
bh.insert(7)
bh.insert(15)
bh.insert(52)
print(bh.delMin())
print(bh.delMin())
print(bh.delMin())
print(bh.delMin())
5
7
15
52

堆次序

二叉堆基本命令

from pythonds.trees.binheap import BinHeap
从无序表生成堆
buildHeap(alist)
插入元素
insert(k)
返回最小元素,并删除
delMin()

堆排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优先散列表,再avl树

BinaryTree()创建一个二叉树实例。
getLeftChild()返回当前节点的左子节点所对应的二叉树。
getRightChild()返回当前节点的右子节点所对应的二叉树。
setRootVal(val)在当前节点中存储参数 val 中的对象。
getRootVal()返回当前节点存储的对象。
insertLeft(val)新建一棵二叉树,并将其作为当前节点的左子节点。
insertRight(val)新建一棵二叉树,并将其作为当前节点的右子节点。
实现树的关键在于选择一个好的内部存储技巧。

Python 提供两种有意思的方式,我们在选择
前会仔细了解这两种方式。第一种称作“列表之列表”,第二种称作“节点与引用”。

在这里插入图片描述
术语及定义

  • 节点

节点是树的基础部分。它可以有自己的名字,我们称作“键”。节点也可以带有附加信息,
我们称作“有效载荷”。有效载荷信息对于很多树算法来说不是重点,但它常常在使用树的应用
中很重要。

边是树的另一个基础部分。两个节点通过一条边相连,表示它们之间存在关系。除了根节点
以外,其他每个节点都仅有一条入边,出边则可能有多条。

  • 根节点

根节点是树中唯一没有入边的节点。在图 6-2 中,/就是根节点。

  • 路径

路径是由边连接的有序节点列表。比如,哺乳纲→食肉目→猫科→猫属→家猫就是一条路径。

  • 子节点

一个节点通过出边与子节点相连。在图 6-2 中,log/、spool/和 yp/都是 var/的子节点。

  • 父节点

一个节点是其所有子节点的父节点。在图 6-2 中,var/是 log/、spool/和 yp/的父节点。

  • 兄弟节点

具有同一父节点的节点互称为兄弟节点。文件系统树中的 etc/和 usr/就是兄弟节点。
子树
一个父节点及其所有后代的节点和边构成一棵子树。

  • 叶子节点

叶子节点没有子节点。比如,图 6-1 中的人和黑猩猩都是叶子节点。

  • 层数

节点 n 的层数是从根节点到 n 的唯一路径长度。在图 6-1 中,猫属的层数是 5。由定义可知,
根节点的层数是 0。

  • 高度

树的高度是其中节点层数的最大值。图 6-2 中的树高度为 2。

用列表实现

def BinaryTree(r):#列表函数
    return [r, [], []]

def insertLeft(root, newBranch):#插入左子树
    t = root.pop(1)
    if len(t) > 1:
        root.insert(1, [newBranch, t, []])
    else:
        root.insert(1, [newBranch, [], []])
        return root
def insertRight(root, newBranch): #插入右子树
    t = root.pop(2)
    if len(t) > 1:
        root.insert(2, [newBranch, [], t])
    else:
        root.insert(2, [newBranch, [], []])
        return root

def getRootVal(root):#树的访问函数
    return root[0]
def setRootVal(root, newVal):
    root[0] = newVal
def getLeftChild(root):
    return root[1]
def getRightChild(root):
    return root[2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!这是一本关于数据结构算法的书,适合于那些想要深入学习这些主题的读者。本书详细介绍了各种常见的数据结构,如数组、链表、栈、队列、、图等,并且介绍了这些数据结构如何使用算法来解决问题。此外,本书还介绍了一些常见的算法,如排序、搜索、图算法等,并详细讲解了这些算法的实现方法和性能分析。如果您对数据结构算法感兴趣,那么本书是一本不错的选择。 ### 回答2: 《Python数据结构算法分析 第二版》是一本非常实用的书籍,对于学习Python编程语言、数据结构算法的人非常重要。该书由Mark Allen Weiss作者编写,首次出版于2007年,此后又经过多次修订和更新。 该书介绍了诸多数据结构,例如数组、链表、堆栈、队列、和图等。每个数据结构都有详细的说明和实现,并通过典型的应用场景来展示它们的使用方法。同时,书中也介绍了常见的算法,例如排序算法、搜索算法、图算法等。对于每个算法,作者都提供了解释、代码实现和运行时间的分析,以帮助读者更好地理解算法。此外,书中还提供了许多习题和编程练习,可供读者深入练习和巩固所学知识。 学习本书的前置知识包括Python编程语言和基本的计算机科学知识,例如循环、条件语句、函数、递归、指针等。对于那些正在学习数据结构算法的人来说,这本书是一本非常有价值的资料,可以帮助他们在Python编程语言中构建和使用数据结构算法。此外,该书还对常见的数据科学问题进行了探讨,例如网络分析、文本分析、图像处理等,这将有助于学习者将所学之外应用于实际领域。 综上所述,《Python数据结构算法分析 第二版》是一本非常实用的书籍,对于学习Python编程语言、数据结构算法的读者非常重要。通过学习本书,读者将掌握Python编程中数据结构算法相关的核心概念和技能,这对于他们进一步深入学习和应用数据科学知识将大有裨益。 ### 回答3: 《Python数据结构算法分析第二版》这本书是一本关于Python数据结构算法的经典教材。本书一共分为十二个章节,从基础知识到高级技术,系统地讲述了Python数据结构算法的应用和实现方法。 第一章是介绍,主要讲述了数据结构算法的概念以及本书的组织结构。 第二章至第四章是关于数据结构的部分。其中第二章讲述了序列结构,包括列表、元组和字符串。第三章是关于栈和队列的知识。本章详细介绍了这两种数据结构的概念、实现以及应用。第四章是关于链表的内容,主要讲述了单向链表和双向链表的应用。 第五章至第八章是关于算法的部分。其中第五章是关于递归的知识,通过介绍递归的概念和原理,以及常见的递归算法,帮助读者更好地理解和应用递归。第六章和第七章分别是关于排序和搜索算法的内容。本章详细介绍了各种常见的排序和搜索算法的原理和应用。第八章是关于动态规划的内容,通过解释动态规划的原理和方法,帮助读者更好地处理动态规划问题。 第九章至第十二章是关于高级技术的部分。其中第九章是关于图算法的内容,介绍了图的数据结构和相关的搜索和最短路径算法,以及其他常见的图算法。第十章是关于哈希表的内容,介绍了哈希表的原理和各种哈希函数的实现方法。第十一章是关于和二叉的内容,从的定义、遍历、二叉和平衡等角度深入讲解了和二叉的基本概念、实现和应用。第十二章是关于字符串处理的内容,主要介绍了各种常见的字符串处理算法和应用。 总之,《Python数据结构算法分析第二版》是一本非常全面、系统和实用的教材,对于掌握Python数据结构算法的知识和技能非常有帮助。对于那些想要提高编程能力和深入了解算法知识的读者来说,这本书是不可多得的宝藏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值