#数据结构学习与分析#
今天学习一个非线性结构----树结构
我们今天的任务是,用列表的方法去实现树结构,也就是说嵌套法实现。
先来提示三个实现中重要的值:
1.根(Root)---根节点是树中唯一一个没有入边的节点。
2.子节点(Children(也叫孩子))---入边均来自同一个节点的若干节点,称为这个节点的子节点
3.父节点parent:一个节点是其所有出边所连接节点的父节点
4.左孩子(Leftchildren)---父节点所连接的左边的子节点
4.右孩子(Rightchildren)----父节点所连接的右边的子节点。
5.
叶节点(Leaf):没有子节点的节点称为叶节点
层级(Level):从根节点开始到达一个节点的路径,所包含的边(Edge)的数量,称为这个节点的层级。
这些基本概念将会出现在我们使用嵌套法实现树时出现。
那么,我们开始吧。
一.列表实现树结构的表现形式
>>>['A',\ #根节点(Root)
['C', ['B', [], []], []],\ #左节点(LeftChildren)
['D', [], []]] #右节点 (RightChildren)
"""
这里我使用了"\"
"""
#当左右节点为空时
>>>[root,[],[]]
嵌套实现树结构的另一个优点是,可以更好的定义多叉树,如:
[root,[],[],...,[]]----实现多叉树
二.列表函数BinaryTree
def BinaryTree(r):
return [r,[],[]]
BinaryTree函数构造一个简单的列表,它仅仅有一个根节点和两个子节点(分别为:左节点,右节点)。
三.插入左子树
def InsertLeft(root,newBranch):
t = root.pop(1)
#将左节点弹出
if len(t) > 1:
root.insert(1,[newBranch,t,[])
#判断左节点是否为空
else:
root,insert(1,[newBranch,[],[])
"""
在这里,newBranch是我们要插入的新节点,
我们把它当作父节点来看待。
当root.pop(1)弹出时,就相当于给我们弹出了个左子节点
我们将新的节点newBranch插入到这个root的左节点中,这时的左节点
相当于空的。
那么我们弹出的左子节点若有值在里面,保留它,把它作为新插入的节点的子节点
"""
注意:这里忘记加入: return root
下方进行演示一遍。
a = BinaryTree('A')
>>>['A', [], []]
insertleftTree(a,'B')
>>>['A', ['B', [], []], []]
insertleftTree(a,'C')
>>>['A', ['C', ['B', [], []], []], []]
"""
可以看到,左节点‘B’在第二次插入左节点时
‘B’就成了"C"的子节点,它被保留下来了,
并且成为新的子树
"""
三.插入右子树
它的插入与左节点的插入大部分相似。
def insertRightTree(r,newBranch):
t = root.pop(2) #注意这里的下标为2
if len(t) > 1:
root.insert(2,[newBranch,[],t])
#注意插入位置为2,且t的位置也是在列表中为2的位置
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] #访问右节点
为了更完整地创建树的函数集。
最后我们完成了嵌套法实现树结构,请自己输入代码试一试。
感谢你的阅读