python 重复元素数组构建陷阱

注:做二叉搜索树算法题时遇到,出现了递归栈溢出的报错问题

class BST:
    def __init__(self,):
        self.value = None
        self.left = None
        self.right = None
        
def Create(node_number):
	"""根据结点个数构建完全二叉树,特殊方法"""
    a = [BST()]* (node_number+1)
 #  a = [BST() for _ in range(node_number+1)]
    i =1 
    while i*2 <= node_number:
        a[i].left = a[i*2]
        if i*2+1 <= node_number:
            a[i].right = a[i*2+1]
        i+=1
    return a[1]

treex = Create(9)
treex.left
<__main__.BST at 0x1d3b081e4e0>
treex.left.left
<__main__.BST at 0x1d3b081e4e0> #你会发现所有结点地址都一样,问题出在哪?

问题所在-数组构建方式

python会为了节省内存,当你使用如下方式构建大量重复元素的数组的时候,元素就是单纯的复制,并不会生成单独不同的个体

a = [BST()]* 5
# 检验一下
a
[<__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>,
 <__main__.BST at 0x1d3b0808be0>]
 # 地址全部相同,不明白的建议学一下C语言

解决方案

 a = [BST() for _ in range(5)]
 a
 [<__main__.BST at 0x1d3b0808550>,
 <__main__.BST at 0x1d3b0808470>,
 <__main__.BST at 0x1d3b0808390>,
 <__main__.BST at 0x1d3b08081d0>,
 <__main__.BST at 0x1d3b0808780>]
 #  地址各不相同

总结

如果单纯的是初始化数组,没有多大影响,但是如果后续操作存在数组内指针指向的话,将会引起严重错误,指针将永远指向一个相同的元素(你原以为下标不同,元素也不同)。递归的时候将会栈溢出
比如二叉树的左右子节点的指向

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值