注:做二叉搜索树算法题时遇到,出现了递归栈溢出的报错问题
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>]
# 地址各不相同
总结
如果单纯的是初始化数组,没有多大影响,但是如果后续操作存在数组内指针指向的话,将会引起严重错误,指针将永远指向一个相同的元素(你原以为下标不同,元素也不同)。递归的时候将会栈溢出
比如二叉树的左右子节点的指向