コレクションからPythonの両端キューは、順序で確定的ではありません。繰り返し実行は異なる結果を与えます

Avinash Koneru:
from collections import deque

class Node(object):
    def __init__(self,val):
        self.value = val
        self.right = None
        self.left = None

class Btree:
    def __init__(self):
        self.root = None

    def btree_print(self):
        if self.root:
            print("Values of btree are")
            q = deque()
            q.append(self.root)
            q.append(None)

            while q:
                parent = q.popleft()
                if parent is None:
                    print("End of  a Level")
                    if q:
                        q.append(None)
                    continue

                print("Value of btree Elm:", parent.value)

                for child in {parent.left, parent.right}:
                    if child:
                        q.append(child)

        else:
            print("Btree Empty")

    def btree_insert_helper(self, val):
        q = deque()
        q.append(self.root)

        while q:
            node = q.popleft()
            for child in {node.left, node.right}:
                if child:
                    q.append(child)
                elif node.left:
                    node.right = Node(val)
                    return
                else:
                    node.left = Node(val)
                    return

    def btree_insert(self, val):
        if self.root:
            self.btree_insert_helper(val)
        else:
            self.root = Node(val)

btree = Btree()
btree.btree_insert(1)
btree.btree_insert(2)
btree.btree_insert(3)
btree.btree_insert(4)
btree.btree_insert(5)
btree.btree_insert(6)
btree.btree_insert(7)

btree.btree_print()

上記のプログラムでは、場合、私はそれは私に異なる結果を与えることだ、それを複数回実行します。私は2つの異なる命令を見ています。かかわらず、ロジックの、結果はそのシングルスレッドプログラムとして、常に同じでなければなりません。私は順序が変更されている理由はわかりません。

期待される結果、Order1:

Values of btree are
Value of btree Elm: 1
End of  a Level
Value of btree Elm: 2
Value of btree Elm: 3
End of  a Level
Value of btree Elm: 4
Value of btree Elm: 5
Value of btree Elm: 6
Value of btree Elm: 7
End of  a Level

予想時にはプログラムは、その結果、以下与えていない(4、5、4、5にひっくり返される)、Order2:

Values of btree are
Value of btree Elm: 1
End of  a Level
Value of btree Elm: 2
Value of btree Elm: 3
End of  a Level
Value of btree Elm: 5
Value of btree Elm: 4
Value of btree Elm: 6
Value of btree Elm: 7
End of  a Level

任意の助けをいただければ幸いです

デイビット・バック:

バイナリツリー自体は一貫しています。お使いのプリント注文が矛盾している理由は、ラインから来ています:

for child in {parent.left, parent.right}:

これは、Aを反復処理されるset{parent.left, parent.right}あなたはどちらか右か、右クリック、左、左反復することができるように設定し、オーダーを持っていません。

それを変更します:

for child in (parent.left, parent.right):

それは一貫して印刷するようになります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=14725&siteId=1