- 树是:空集;
或者由根节点及0或多个子树构成(其中子树也是树),每个子树的根到根节点具有边相连。
-
用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, [], []]
“”"
- 可以用节点链接法来实现树
每个节点保存根节点的数据项,以及指向左右子树的链接
- 代码
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’)
1.树的应用:解析树(语法树)
-
将树用于表示语言中句子,可以分析句子的各种语法成分,对句子的各种成分进行处理
-
语法分析树 主谓宾,定状补
-
程序设计语言的编译 1.词法、语法检查 2.从语法树生成目标代码
-
自然语言处理 机器翻译、语义理解
2.树的应用:表达式解析
-
我们还可以将表达式表示为树结构 叶节点保存操作数,内部节点保存操作符
-
详细内容 树的应用:表达式解析
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)
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
def preorder(self):
print(self.key)
if self.leftChild:
self.leftChild.preorder()
if self.rightChild:
self.rightChild.preorder()
采用中序遍历递归算法来生成全括号中缀表达式
def printexp(tree):
sVal = “”
if tree:
sVal = ‘(’ + printexp(tree.getLeftChild())
sVal = sVal + str(tree.getRootVa1())
sVal = sVal + printexp(tree. getRightChild())+’ )’
return sVal
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)
的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-QUihS1St-1713671631274)]
[外链图片转存中…(img-YHLEBHon-1713671631275)]
[外链图片转存中…(img-gvtCYVjS-1713671631276)]
[外链图片转存中…(img-XLYHM8CR-1713671631276)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)