Tenho o seguinte problema: Estou fazendo uma Árvore Rubro-Negra em Python, e quando vou excluir uma raíz que tenha um só filho, acontece o problema, abaixo segue meu código
`
BLACK = 0
RED = 1
class No():
def __init__(self, valor, pai=None, esquerda=None, direita=None, cor=RED):
self.valor = valor
self.esquerda = esquerda
self.direita = direita
self.pai = pai
if pai == None:
self.cor = BLACK
else:
self.cor = cor
def filho_nao_nulo(self):
return (self.direita if self.direita != None else self.esquerda)
def remover(self, valor):
#global raiz
no = self
if no == None:
return None
if valor < no.valor:
no.esquerda.remover(valor)
elif valor > no.valor:
no.direita.remover(valor)
else:
#o nó encontrado só tem um filho
if no.direita != None or no.esquerda != None:
if no.cor == BLACK:
#se o nó é a raiz
if no.pai == None:
if no.esquerda == no.filho_nao_nulo():
no = no.esquerda
no.cor = BLACK
else:
no = no.direita
no.cor = BLACK
raiz = No(12)
raiz.direita = No(14, raiz)
raiz.remover(12)
`
Ao chegar na linha
no = no.direita
o debug está dessa maneira:

Ao executar essa linha, apenas a variável local “no” é alterada, mas a global “raiz” não, sendo que ambas se referenciam ao mesmo endereço de memória

o nó passa a ter o endereço de memória da direita da raiz, como deveria ser feito com a raiz, mas a raiz não é alterada.
O mais estranho é que isso só acontece com a raiz, se o nó, por exemplo fosse igual a raiz.direita.esquerda, não haveria problema nenhum com qualquer operação que eu quisesse fazer sobre esse nó, ele alteraria tanto a variável local, como a global.
Tive um problema semelhante na árvore AVL.
A solução temporária que tive foi declarar o código
global raiz
no início do método, e mudar a raiz diretamente. Mas li sobre, e vi que isso não é uma boa prática. Alguém poderia me ajudar ? Obrigado.