2016-12-21 3 views
1
public class Solution { 
     public TreeNode invertTree(TreeNode root) { 
     if(root == null) return null; 
      TreeNode tmp = root.left; 
      root.left = invertTree(root.right); 
      root.right = invertTree(tmp); 
      return root; 
     } 
} 

上記の解決策はなぜ機能するのか分かりませんが、バイナリツリーを逆転しようとすると、新しい一時的なTreeNodeを作成する必要がある理由を理解できません。

public class Solution { 
     public TreeNode invertTree(TreeNode root) { 
     if(root == null) return null; 
      root.left = invertTree(root.right); 
      root.right = invertTree(root.left); 
      return root; 
     } 
} 

誰かが、プログラムが動作するために一時的なTreeNodeが必要な理由を詳しく説明してください。

答えて

0

まず、最初のスニペットは新しいTreeNodeを作成しません。これはルートの元の左の子への参照を格納するだけです。

2番目のスニペットのようにその参照を保持しないと、root.leftに右のサブを反転した結果が割り当てられているため、ルートの元の左のサブツリーへの参照が失われています-tree(root.left = invertTree(root.right);)、したがってinvertTree(root.left)はルートの元の左のサブツリーでは動作しません。

一時変数の理由は、2つの変数を交換するために一時変数が必要な理由と似ています。

+0

私の悪いとありがとう! – user6807001

0

2番目の割り当ての後、root.leftにroot.rightを割り当てますが、前の行ではroot.leftをroot.rightに設定するため、root.rightはそれ自体と同じになります。

+0

ありがとうございました!それは実際にはとても意味をなさない... – user6807001

+0

あなたは大歓迎です! @ user6807001 –

関連する問題