Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでノードを削除してフォレストを返す


二分木のルートがあるとすると、ツリー内の各ノードには一意の値があります。 to_deleteの値を持つすべてのノードを削除すると、フォレストが残ります。残りの森で木の根を見つけなければなりません。したがって、入力が次のような場合

Pythonでノードを削除してフォレストを返す

to_delete配列が[3,5]のような場合、出力は

になります。

Pythonでノードを削除してフォレストを返す

これを解決するには、次の手順に従います-

  • 配列解像度を定義する
  • メソッドsolve()を定義します。これにより、ノード、to_delete配列、およびノー​​ドがルートであるかどうかを示すブール型の情報が取得されます。メソッドは以下のように動作します-
  • ノードがnullの場合、nullを返します
  • フラグ:=ノードの値がto_delete配列にある場合はtrue
  • フラグがfalseでis_rootがtrueの場合、ノードをresに挿入します
  • ノードの左側:=solve(ノードの左側、to_delete、フラグ)
  • ノードの権利:=solve(ノードの権利、to_delete、フラグ)
  • フラグが設定されている場合はnoneを返し、それ以外の場合はfalseを返します
  • resolve(node、to_delete、true)などのメインメソッドからsolve()メソッドを呼び出します

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def delNodes(self, root, to_delete):
      """
      :type root: TreeNode
      :type to_delete: List[int]
      :rtype: List[TreeNode]
      """
      to_delete = set(to_delete)
      self.res = []
      self.solve(root,to_delete,True)
      return self.res
   def solve(self,node,to_delete,is_root):
      if not node:
         return None
      flag = node.val in to_delete
      if not flag and is_root:
         self.res.append(node)
      node.left = self.solve(node.left,to_delete,flag)
      node.right = self.solve(node.right,to_delete,flag)
      return None if flag else node

入力

[1,2,3,4,5,6,7]
[3,5]

出力

[[1,2,null,4],[6],[7]]

  1. Pythonでバイナリツリーのリーフノードと非リーフノードを検索するプログラム

    二分木があるとすると、2つの数字のリストを見つける必要があります。最初の数字はツリー内の葉の数で、2番目の数字は非葉ノードの数です。 したがって、入力が次のような場合 3つのリーフと2つの非リーフノードがあるため、出力は(3、2)になります。 これを解決するには、次の手順に従います- nがnullの場合、 return(0、0) nの左側がnullで、nの右側がnullの場合、 return(1、0) 左:=ソルブ(nの左) right:=resolve(right of n) return(left [0] + right [0]、1 + left [1]

  2. Pythonでプレオーダーおよびポストオーダートラバーサルからバイナリツリーを構築する

    PreorderとPostorderの2つのトラバーサルシーケンスがあるとすると、これら2つのシーケンスからバイナリツリーを生成する必要があります。したがって、シーケンスが[1,2,4,5,3,6,7]、[4,5,2,6,7,3,1]の場合、出力はになります。 これを解決するには、次の手順に従います- ans:=値pre [0]を取得してツリーノードを作成し、スタック:=空のスタックを作成し、ansを挿入します i:=1およびj:=0 whilei<前の長さとj<後の長さ スタックの最上位値=post[j]の場合、jを1増やし、スタックからポップして、次の反復に進みます n