Python数据结构与算法(6)--树

12.树的定义1

  • 树由若干节点,以及两两连接节点的边组成,并有如下性质

其中一个节点被设定为根;

每个节点n(除根节点),都恰连接一 条来自节点p的边, p是n的父节点;

每个节点从根开始的路径是唯一的

如果每个节点最多有两个子节点, 这样的树称为“ 二叉树”

请添加图片描述

13.树的定义2(递归定义)

  • 树是:空集;

或者由根节点及0或多个子树构成(其中子树也是树),每个子树的根到根节点具有边相连。

请添加图片描述

3.树的嵌套列表实现


  • 用Python List来实现二叉树树数据结构;

  • 归的嵌套列表实现二叉树,由具有3个元素的列表实现:

第1个元素为根节点的值;

第2个元素是左子树(所以也是一个列表);

第3个元素是右子树(所以也是一个列表)。

[root,;left,right]

  • 嵌套列表法的优点

子树的结构与树相同,是一种递归数据结构

很容易扩展到多叉树,仅需要增加列表元素即可

请添加图片描述

myTree = [‘a’,

[‘b’, [‘d’,[],[]] , [‘e’,[],[]] ],

[‘c’, [‘f’,[],[]] , [] ]

]

  • 我们通过定义一系列函数来辅助操作嵌套列表

BinaryTree创建仅有根节点的二叉树

insertLeft/insertRight将新节点插入树中作为其直接的左/右子节点

get/setRootVal则取得或设置根节点

getLeft/RightChild返回左/右子树

def BinaryTree®:

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 ]

r = BinaryTree(3)

insertLeft(r,4)

insertLeft(r,5)

insertRight(r,6)

insertRight(r,7)

l = getLeftChild®

print(l)

setRootVal(l,9)

print®

insertLeft(l,11)

print®

print(getRightChild(getRightChild®))

#结果

“”"

[5, [4, [], []], []]

[3, [9, [4, [], []], []], [7, [], [6, [], []]]]

[3, [9, [11, [4, [], []], []], []], [7, [], [6, [], []]]]

[6, [], []]

“”"

4.树的链表(节点与引用)实现


  • 可以用节点链接法来实现树

每个节点保存根节点的数据项,以及指向左右子树的链接

在这里插入图片描述

  • 代码

class BinaryTree:

def init( self , rootObj):

self.key = rootObj

self.leftChild = None

self.rightChild = None

def insertLeft(self,newNode):

if self.leftChild == None:

self.leftChild = BinaryTree(newNode)

else:

t = BinaryTree(newNode)

t.leftChild = self.leftChild

self.leftChild = t

def insertRight(self, newNode):

if self.rightChild == None:

self.rightChild = BinaryTree(newNode)

else:

t = BinaryTree(newNode)

t.rightChild = self.rightChild

self.rightChild = t

def getRightChild(self):

return self.rightChild

def getLeftChild(self):

return self.leftChild

def setRootVal(self, obj):

self.key = obj

def getRootVal(self):

return self.key

r = BinaryTree(‘a’)

r.insertLeft( ‘b’ )

r.insertRight(‘c’)

r.getRightChild().setRootVal( ‘hello’)

r.getLeftChild().insertRight(‘d’)

在这里插入图片描述

5.树的应用:表达式解析


1.树的应用:解析树(语法树)

  • 将树用于表示语言中句子,可以分析句子的各种语法成分,对句子的各种成分进行处理

  • 语法分析树 主谓宾,定状补

  • 在这里插入图片描述

  • 程序设计语言的编译 1.词法、语法检查 2.从语法树生成目标代码

  • 自然语言处理 机器翻译、语义理解

2.树的应用:表达式解析

6.树的遍历


1.树的遍历Tree Traversals

  • 对一个数据集中的所有数据项进行访问的操作称为“遍历Traversal”

  • 线性数据结构中,对其所有数据项的访问比较简单直接

按照顺序依次进行即可

  • 树的非线性特点,使得遍历操作较为复杂

  • 我们按照对节点访问次序的不同来区分3 种遍历

  • 前序遍历(preorder):先访问根节点,再递归地前序访问左子树、最后前序访问右子树;

  • 中序遍历(inorder):先递归地中序访问左子树,再访问根节点,最后中序访问右子树;

  • 后序遍历(postorder):先递归地后序访问左子树,再后序访问右子树,最后访问根节点。

  • 前、中、后是相对于根节点而言的

前序遍历

def preorder(tree):

if tree:

print (tree.getRootVal( ))

preorder(tree.getLeftChild())

preorder(tree.getRightChild())

中序遍历

def inorder(tree):

if tree:

preorder(tree.getLeftChild())

print(tree.getRootVal())

preorder(tree.getRightChild())

后序遍历

def postorder(tree):

if tree:

preorder(tree.getLeftChild())

preorder(tree.getRightChild())

print(tree.getRootVal())

也可以在BinaryTree类中实现前序遍历的方法:

需要加入子树是否为空的判断

class BinaryTree:

def init( self , rootObj):

self.key = rootObj

self.leftChild = None

self.rightChild = None

def insertLeft(self,newNode):

if self.leftChild == None:

self.leftChild = BinaryTree(newNode)

else:

t = BinaryTree(newNode)

t.leftChild = self.leftChild

self.leftChild = t

def insertRight(self, newNode):

if self.rightChild == None:

self.rightChild = BinaryTree(newNode)

最后

Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

👉Python所有方向的学习路线👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉Python必备开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

👉Python全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

👉实战案例👈

学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。

因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。

👉大厂面试真题👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值