嵌套法实现树结构

#数据结构学习与分析#

今天学习一个非线性结构----树结构

我们今天的任务是,用列表的方法去实现树结构,也就是说嵌套法实现

先来提示三个实现中重要的值:
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] #访问右节点

为了更完整地创建树的函数集。

最后我们完成了嵌套法实现树结构,请自己输入代码试一试。

感谢你的阅读

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值