2017-10-26 7 views
0

Bei einem binären Baum prüfen, ob es ein Spiegel von sich selbst ist (dh symmetrisch um sein Zentrum).symmetrischer Baumalgorithmus (Invert + gleicher Baum)

Es ist eine Frage zu Leetcode. Was ich tue ist, den Baum zu invertieren und dann zu vergleichen, ob der umgekehrte Baum derselbe wie der ursprüngliche Baum ist. Aber ich kann den Testfall nicht bestehen. Mein Code ist wie folgt, kann mir jemand einen Vorschlag geben? Vielen Dank.

Klasse Solution (Objekt):

def isSymmetric(self, root): 
    node = self.invert(root) 
    def dfs(root, node): 
     if not root and not node: 
      return True 
     if not root or not node: 
      return False 
     if root.val == node.val and dfs(root.left, node.left) and dfs(root.right, node.right): 
      return True 
     else: 
      return False 

    return dfs(root, node) 


def invert(self, node): 
    if node: 
     node.left, node.right = self.invert(node.right), self.invert(node.left) 
    return node 

Antwort

0

Es sieht aus wie viel Arbeit zu invertieren und zu validieren. Sie können versuchen, den Baum zu drucken und den Rückgabewert bei jedem Schritt zu verfolgen. Meine Vermutung ist, dass es keine Zeit mehr hat, da es zusätzliche Operationen gibt.

Oder

Sie können durch den Baum Rekursion und prüfen, ob für jeden Knoten links und rechts Spiel.

Beispiel:

def isSymmetric(self, root) 
    #single node or no node 
    if root == null : 
     return false 

    else : 
     return dfs(root) 

def dfs(root): 
    #single node 
    if(root.left == null and root.right == null): 
     return true 

    #both childs exist 
    if(root.left != null and root.right != null): 
     return (dfs(root.left) & dfs(root.right)) 

    #Asymmetric 
    else : 
     return false 
+0

Vielen Dank für Ihre Antwort. Ich kann Ihre Methode verstehen, habe aber immer noch Probleme mit meiner Methode. Denkst du, meine Logik (zuerst den Baum invertieren und dann den inversen Baum mit dem Original vergleichen) ist richtig? –

+0

Sie müssen verstehen, dass Leetcode Testfall sogar bei Timeout fehlschlagen kann. Die umgekehrte Logik sieht für mich korrekt aus. Versuchen Sie es lokal auszuführen und drucken Sie es aus, um das Ergebnis zu sehen. –

+0

Es ergab sich für folgenden Baum. bedeutet dfs Logik ist falsch. Es schlägt bei der ersten Bedingung fehl, da es immer true zurückgibt, wenn beide Knoten keine sind: root = node (2) root.left = Knoten (3) root.right = Knoten (4) root.left.left = Knoten (5) –