2009-08-31 13 views
1

イムのpythonに問題が..私は、バイナリツリーノードのタイプがあります。Pythonのクラス可変性

class NODE: 
     element = 0 
     leftchild = None 
     rightchild = None 

をそして私は、関数deleteminを実装する必要がありました:まだ

def DELETEMIN(A): 
     if A.leftchild == None: 
       retval = A.element 
       A = A.rightchild 
       return retval 
     else: 
       return DELETEMIN(A.leftchild) 

を、とき私は、バイナリツリーの上にこれをテストしてみてください:

1 
/\ 
0 2 

それはちょうどnullに設定することで、0を削除する必要はなく、私はこれを取得:

0 
/\ 
0 2 

なぜPythonで関数内のノードを無効にできないのですか?彼らはこれを行う方法ですか?

答えて

2

Pythonは、変数参照ではなく、Javaのようにオブジェクト参照によって引数を渡します。ローカル変数(引数を含む)に新しい値を代入すると、ローカル変数だけが変更されます。何も変更されません(ミューテータの呼び出しやオブジェクトの属性への割り当てと混同しないでください)。 barenamesに)。

Pythonでの望ましい解決策は、通常、必要な数だけ複数の値を返し、呼び出し元で適切に割り当てることです。したがって、deleteminは現在のreturnvalと変更されたノードという2つの値を返し、呼び出し側は必要に応じて後者を割り当てます。すなわち:

def DELETEMIN(A): 
     if A.leftchild is None: 
       return A.element, A.rightchild 
     else: 
       return DELETEMIN(A.leftchild) 

と以前foo = DELETEMIN(bar)を持っていた、発信者、で、あなたはところで、代わりに括弧内

foo, bar = DELETEMIN(bar) 

独特の総額との間隔を使用したいが、それは;-)別の問題です。

CやC++などのように、「呼び出し元の裸名へのポインタまたは参照」(PythonまたはJava)を取得する方法はありません。他の代替アプローチもありますが、あなたが好むと思われるものとは異なる取り決めが必要なので、ここに示すように複数の戻り値アプローチをお勧めします。

+0

うーん、あなたが他の を意味いけない: FOO、A.leftchild = DELETEMIN(A.leftchild) リターンFOO、A.leftchild – DevDevDev

+0

各再帰の場合は、ときベース '.leftchild'を再割り当てする必要がないのはなぜ呼び出し元は "root"を変更します。 'バー'?私はそれを果たしていないが、それは同等のようだ。 –

0
class Node: 
    element = 0; 
    left_child = None 
    right_child = None 

def delete_min(A): 
    if A.left_child is None: 
     return A.right_child 
    else: 
     A.left_child = delete_min(A.left_child) 
     return A 

tree = delete_min(tree) 
関連する問題