6

This is my code-snippet for a Binary Tree implementation in Python. This WORKS when I run the PreOrder function.

class Node:
    def __init__(self,data):
        self.left = None
        self.right = None
        self.data = data

class BinaryTree(Node):
    def __init__(self):
        self.root = None

    def addNode(self,data):
        return Node(data)

    def insert(self,root,data):
        if(root == None):
            root = self.addNode(data)
        else:
            if(data <= root.data):
               root.left = self.insert(root.left,data)
            else:
                root.right = self.insert(root.right,data)
        return root

    def PreOrder(self,root):
        if root == None:
            pass
        else:
            print(root.data)
            self.PreOrder(root.left)
            self.PreOrder(root.right)



a = BinaryTree()
root = a.addNode(2)
#root = None
a.insert(root,4)
a.insert(root,34)
a.insert(root,45)
a.insert(root,46)
a.insert(root,41)
a.insert(root,48)
a.PreOrder(root)

However changing the 2nd and the 3rd lines in main to

#root = a.addNode(2)
root = None

doesn't print anything. I feel I am missing out on something basic here. Any clarifications will be gratefully appreciated.

4

3 に答える 3

8

None次のように定義した関数に渡します。

if root == None:
    pass

そのため、何も印刷されません。

また、これは単なる個人的な見解です。実際には、PreOrderに自己引数のみを受け入れさせ、そこからPreOrderを実行するため、再帰的に定義するのが非常に簡単になります。

基本的に次のようなものです。

 def PreOrder(self):
     print self.data 
     if self.left:
          print self.left.PreOrder()
     if self.right:
          print self.right.PreOrder()

しかし、これは好みの問題であり、ソリューションは問題なく機能します。

露骨な宣伝として、私は最近、Pythonで基本的なBinaryTreeを書くことについての投稿を実際に書きました。それをチェックしたい場合は、ここで見つけることができます。

http://intothewebs.tumblr.com/post/40256328302/embrace-the-basics-binary-tree

アップデート:

わかりました、あなたがコメントした後、私はあなたの疑いを理解します。

Pythonのパラメーターは値で渡されるため、メソッドに渡されるルートパラメーターは実際には変更されません。

参照によって変数を渡すにはどうすればよいですか?

この質問で受け入れられた答えを読んでください、それは素晴らしいです、そしてそれが意味することを説明するべきです。

あなたの持っている:

root = None
a = a.insert(root,4)
a.insert...

などなど、コードは機能するはずです。

于 2013-01-21T13:23:35.010 に答える
1

あなたが持っていてroot = None、それからPreOrderあなたの最初の行にあるif root == None: passので、それはあなたのために何もするつもりはありません。

于 2013-01-21T13:23:48.017 に答える
1
class Node:
def __init__(self,data):
    self.left = None
    self.right = None
    self.data = data

class BinaryTree:

    def __init__(self):
        self.root = None


    def insert_node(self,root,element):
        if self.root is None:
            self.root = Node(element)
        else:

            if root is None:
                root = Node(element)
            elif root.data <= element:
                root.right = self.insert_node(root.right,element)
            elif root.data > element:
                root.left = self.insert_node(root.left,element)


        return root

    def PreOrder(self,root):
        if root is not None:
            print(root.data)
            if root.left is not None:
                self.PreOrder(root.left)
            if root.right is not None:
                self.PreOrder(root.right)



a = BinaryTree()
a.insert_node(a.root,3)
a.insert_node(a.root,4)
a.insert_node(a.root,34)
a.insert_node(a.root,45)
a.insert_node(a.root,46)
a.insert_node(a.root,2)
a.insert_node(a.root,48)
a.PreOrder(a.root)
于 2014-12-17T10:23:08.137 に答える