-
用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:
最后
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python所有方向的学习路线👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
👉Python全套学习视频👈
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
👉实战案例👈
学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。
👉大厂面试真题👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!