2016-10-12 15 views
0

thisリートコードに関する質問ですが、このコードはすべてのテストケースを通過しています。バイナリツリーの復旧

class Solution(object): 
def recoverTree(self, root): 
    self.first = None 
    self.second = None 
    self.prev = TreeNode(float('-inf')) 

    self.traverse(root) 

    temp = self.first.val 
    self.first.val = self.second.val 
    self.second.val = temp 

def traverse(self, root): 
    if not root: 
     return 
    self.traverse(root.left) 
    if not self.first and self.prev.val >= root.val: 
     self.first = self.prev 
    if self.first and self.prev.val >= root.val: 
     self.second = root 
    self.prev = root 
    self.traverse(root.right) 

このコードの一部について質問があります。

if not self.first and self.prev.val >= root.val: 
    self.first = self.prev 
if self.first and self.prev.val >= root.val: 
    self.second = root 

このスニペットでは、最初の条件が設定されてから2番目の条件は常に真ではありません。だから、あなたはとしてそれを書くcoud:

def not self.first and self.prev.val >= root.val: 
    self.first = self.prev 
    self.second = root 

しかし、私はこれをしようと、私はテストケースを渡しません。それはなぜですか?最初のifステートメントの条件を受け入れ、self.firstを代入すると、次のifステートメントが常に真になるように見えます。しかし、現実にはこれは当てはまらないようです。誰かがここで起こっていることを説明できますか?

+0

二番目のif文にはありません。 – Natecat

+0

@Natecatですが、最初のif文がtrueの場合、self.firstがNoneの場合、ステートメントに入るとself.first = self.prev、self .FirstはもはやNoneではなく、2番目のif文の条件は常に真です。 – user3408657

答えて

0

self.second = rootをまだ実行しているため、コードが異なります。 self.firsttrueまたはfalseのいずれかであるかどうかに関わらず、この行を実行する前に、を再生してください。

self.firsttrueであり、期待される結果がself.second == rootである可能性がある。